00001 #include "creep_effym.h"
00002 #include "matrix.h"
00003 #include "vector.h"
00004 #include "elastisomat.h"
00005 #include "global.h"
00006 #include "intpoints.h"
00007 #include "vecttens.h"
00008 #include <math.h>
00009
00010
00011
00012
00013 creep_effym::creep_effym (void)
00014 {
00015
00016 }
00017
00018
00019
00020
00021 creep_effym::~creep_effym (void)
00022 {
00023
00024 }
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 void creep_effym::matstiff (matrix &d,long ipp,long im, long ido)
00039 {
00040 long idem = Mm->ip[ipp].gemid();
00041 long ncomp = Mm->ip[ipp].ncompstr;
00042 Mm->matstiff(d, ipp, idem, ido+ncomp);
00043 }
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 void creep_effym::nlstresses (long ipp, long im, long ido)
00059 {
00060 long i, idem;
00061 long ncomp = Mm->ip[ipp].ncompstr;
00062 double e, e0, nu;
00063 vector epsn(ncomp),eps_cr(ncomp),sigma(ncomp);
00064 matrix d(ncomp,ncomp);
00065
00066
00067 if (Mm->ip[ipp].ssst == planestress)
00068 {
00069 idem = Mm->ip[ipp].gemid();
00070 nu = Mm->eliso[Mm->ip[ipp].idm[idem]].nu;
00071 Mm->ip[ipp].strain[3] = -nu / (1.0 - nu) * (Mm->ip[ipp].strain[0]+Mm->ip[ipp].strain[1]);
00072 }
00073
00074 e = Mm->give_actual_ym(ipp, im, ido);
00075 e0 = Mm->give_initial_ym(ipp, im, ido);
00076
00077 for (i=0;i<ncomp;i++){
00078 epsn[i] = Mm->ip[ipp].strain[i];
00079 }
00080 Mm->elmatstiff (d,ipp);
00081
00082
00083 for (i=0;i<ncomp;i++)
00084 {
00085 eps_cr[i] = (e0-e)/e0*epsn[i];
00086 Mm->ip[ipp].other[ido+i] = eps_cr[i];
00087 }
00088 subv(epsn, eps_cr, eps_cr);
00089 mxv(d, eps_cr, sigma);
00090
00091 for (i=0;i<ncomp;i++){
00092 Mm->ip[ipp].stress[i]=sigma[i];
00093 }
00094 }
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106 void creep_effym::updateval (long ipp, long im, long ido)
00107 {
00108 long i,n = Mm->givencompeqother(ipp,im);
00109
00110 for (i=0;i<n;i++){
00111 Mm->ip[ipp].eqother[ido+i]=Mm->ip[ipp].other[ido+i];
00112 }
00113 }
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126 void creep_effym::giveirrstrains (long ipp, long im, long ido, vector &epscr)
00127 {
00128 long i,n = Mm->givencompeqother(ipp,im);
00129
00130 for (i=0;i<n;i++){
00131 epscr[i]=Mm->ip[ipp].eqother[ido+i];
00132 }
00133 }
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 double creep_effym::give_actual_ft (long ipp, long im, long ido)
00147 {
00148 double ft;
00149 if (im > 0)
00150 ft = Mm->give_actual_ft(ipp, im+1, ido);
00151 else
00152 {
00153 print_err("creep_effym model does not contain tensile strength", __FILE__, __LINE__, __func__);
00154 abort();
00155 }
00156 return ft;
00157 }