00001 #include "visplast.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 visplast::visplast (void)
00014 {
00015
00016 }
00017
00018
00019
00020
00021 visplast::~visplast (void)
00022 {
00023
00024 }
00025
00026
00027
00028
00029
00030
00031
00032
00033 void visplast::matstiff (matrix &d,long ipp,long im,long ido)
00034 {
00035 switch (Mp->nlman->stmat){
00036 case initial_stiff:{
00037 Mm->elmatstiff (d,ipp);
00038 break;
00039 }
00040 case tangent_stiff:{
00041 Mm->elmatstiff (d,ipp);
00042 break;
00043 }
00044 default:{
00045 print_err("unknown type of stifness matrix is required",__FILE__,__LINE__,__func__);
00046 }
00047 }
00048
00049 }
00050
00051
00052
00053
00054
00055
00056 void visplast::givestressincr (long ipp,long ido,long fi,vector &sig)
00057 {
00058 long i,j,ncomp;
00059 ncomp=Mm->ip[ipp].ncompstr;
00060
00061 if (ncomp!=sig.n){
00062 print_err("number of components of sig is not equal to ncomp",__FILE__,__LINE__,__func__);
00063 abort ();
00064 }
00065
00066 for (i=fi,j=0; j<sig.n; i++,j++){
00067 sig[j]=Mm->ip[ipp].eqother[ido+i];
00068 }
00069 }
00070
00071
00072
00073
00074 void visplast::storestressincr (long ipp,long ido,vector &sig)
00075 {
00076 long i,ncomp;
00077 ncomp=Mm->ip[ipp].ncompstr;
00078
00079 if (ncomp!=sig.n){
00080 print_err("number of components of sig is not equal to ncomp",__FILE__,__LINE__,__func__);
00081 abort ();
00082 }
00083
00084 for (i=0;i<ncomp;i++){
00085 Mm->ip[ipp].eqother[ido+i]=sig[i];
00086 }
00087 }
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 void visplast::nlstressesincr (long ipp,long im,long ido)
00099 {
00100 long i,ncompo,ncomp=Mm->ip[ipp].ncompstr,ncompq=1;
00101 double dt;
00102 vector sig(ncomp),q(ncompq),epsn(ncomp),epso(ncomp),epsp(ncomp);
00103 matrix d(ncomp,ncomp);
00104
00105
00106 ncompo=Mm->givencompother(ipp,im+1);
00107
00108
00109 for (i=0;i<ncomp;i++){
00110 sig[i]=Mm->ip[ipp].stress[i];
00111 }
00112
00113 Mm->give_interparam (ipp,im+2,ido+ncompo,q);
00114
00115
00116 dt=Mp->timecon.actualforwtimeincr ();
00117
00118 Mm->stiff_deps_vispl (ipp,im,ido,sig,q,dt);
00119
00120 for (i=0;i<ncomp;i++){
00121 Mm->ip[ipp].eqother[ido+i]=sig[i];
00122 }
00123
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134 void visplast::nlstresses (long ipp,long ido)
00135 {
00136 long i,ncomp=Mm->ip[ipp].ncompstr,ncomph=1;
00137 vector sig(ncomp),sigp(ncomp),q(ncomph),epsn(ncomp),epso(ncomp),deps(ncomp);
00138 matrix d(ncomp,ncomp);
00139
00140 for (i=0;i<ncomp;i++){
00141
00142 epsn[i] = Mm->ip[ipp].strain[i];
00143
00144 epso[i] = Mm->ip[ipp].eqother[ido+ncomp+i];
00145
00146 sigp[i] = Mm->ip[ipp].eqother[ido+2*ncomp+i];
00147 }
00148
00149
00150 subv (epsn,epso,deps);
00151
00152 Mm->matstiff(d,ipp);
00153
00154 mxv (d,deps,sig);
00155
00156
00157 for (i=0;i<ncomp;i++){
00158
00159 Mm->ip[ipp].stress[i]=sig[i]+sigp[i]-Mm->ip[ipp].eqother[ido+i];
00160 }
00161 }
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171 void visplast::updateval (long ipp, long im, long ido)
00172 {
00173 long i;
00174 long ncomp;
00175
00176
00177 ncomp=Mm->ip[ipp].ncompstr;
00178
00179 for (i=0;i<ncomp;i++){
00180
00181 Mm->ip[ipp].eqother[ido+ncomp+i] = Mm->ip[ipp].strain[i];
00182
00183 Mm->ip[ipp].eqother[ido+2*ncomp+i]=Mm->ip[ipp].stress[i];
00184 }
00185 }