⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dloadcase.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
字号:
#include <math.h>#include "dloadcase.h"#include "loadcase.h"#include "global.h"#include "gtopology.h"#include "matrix.h"#include "vector.h"#include "globmat.h"#include "dloadn.h"#include "dloadpd.h"#include "element.h"#include "node.h"dloadcase::dloadcase (void){  nslc=0;  nln = 0;  nle = 0;  npd = 0;  lon = NULL;  pd = NULL;  slc = NULL;  gf=NULL;}dloadcase::~dloadcase (void){  delete [] lon;  delete [] pd;  delete [] slc;  delete [] gf;}/**   function reads load case characteristics      @param in - input stream      24.7.2001*/void dloadcase::read (XFILE *in){  long i;    //  type of dynamic load  xfscanf (in,"%k%d","type_of_dyn_load",(int*)&tdl);    switch (tdl){  case forcedload:{    //  number of subload cases    xfscanf (in,"%ld",&nslc);        slc = new loadcase [nslc];    gf = new gfunct [nslc];        for (i=0;i<nslc;i++){      slc[i].read (in);      gf[i].read (in);    }        break;  }  case seismicload:{    stool.read (in);    break;  }  case responsespectrum:{    stool.read (in);    break;  }  case forceload_dyn:{        //  loaded nodes    xfscanf (in,"%ld",&nln);    lon = new dloadn [nln];    for (i=0;i<nln;i++){      lon[i].read (in);    }            /*      //  loaded elements    fscanf (in,"%ld",&nle);    loe = new dloadel [nle];    for (i=0;i<nle;i++){    loe[i].read (in);    }*/                //  prescribed displacements    xfscanf (in,"%ld",&npd);    pd = new dloadpd [npd];    for (i=0;i<npd;i++){      pd[i].read (in);    }        break;  }      default:{    fprintf (stderr,"\n\n unknown type of load case is required in function read (file %s, line %d).\n",__FILE__,__LINE__);  }  }}/**   function assembles vector of right hand side      @param lcid - load case id   @param rhs - right hand side vector   @param t - actual time   26.10.2001*/void dloadcase::assemble (long lcid,double *rhs,long n,double t){  long i,j,k,ndofn,ndofe,*cn;  vector r,f;  matrix sm;    double a,*aux;    // nullv (rhs,Ndofm);    switch (tdl){    /*  case forcedload:{    //  auxiliary array    aux = new double [n];    tottempr = NULL;          for (i=0;i<nslc;i++){      nullv (aux,n);      btemp = 0;      if (slc[i].tempchang == 1)      // temperature load needs separate time coeficient multiplication      {        btemp = 1;        slc[i].tempchang = 0;      }      //  assembling of vector of contributions      slc[i].assemble (0,aux);      //  scale factor      a=gf[i].getval(t);            if (btemp==1)      // temperature load is present in the current subloadcase      {        //  approximation of nodal temperatures        intpointval (slc[i].pt, temperature);        Mm->temprstrains (lcid);        nodal_eigstrain_forces (lcid, aux);        slc[i].tempchang = 1;      }      //  updating of rhs array      for (j=0;j<n;j++){	rhs[j]+=a*aux[j];      }      if ((tottempr == NULL) && (Mp->temperature))      {        tottempr = new double[Mm->tnip];        nullv(tottempr, Mm->tnip);      }      if (Mp->temperature)      {        for(j=0; j<Mm->tnip; j++)          tottempr[j] += a*Mm->tempr[j];      }    }    if (Mp->temperature)    {      for(j=0; j<Mm->tnip; j++)        Mm->tempr[j] = tottempr[j];    }    delete [] tottempr;    delete [] aux;    break;  }  */  case forcedload:{    aux = new double [n];        for (i=0;i<nslc;i++){      nullv (aux,n);      //  scale factor      a=gf[i].getval(t);            //  assembling of vector of contributions      slc[i].assemble (0,aux,a);      //  updating of rhs array      for (j=0;j<n;j++){	rhs[j]+=aux[j];      }    }    delete [] aux;    break;  }  case seismicload:{        //  auxiliary array    aux = new double [n];        stool.assemble (rhs,t);    Mmat->gmxv (rhs,aux);        copyv (aux,rhs,n);        delete [] aux;        break;  }  case responsespectrum:{    //stool.assemble (rhs,t);    break;  }  case forceload_dyn:    {            //  contributions from nodes      for (i=0;i<nln;i++){	ndofn=Mt->give_ndofn (lon[i].idn);	for (j=0;j<ndofn;j++){	  k=Mt->give_dof (lon[i].idn,j);	  if (k<=0)  continue;	  if (k>0)  rhs[k-1]+=lon[i].getval(t,j);	}      }                  /*      //  contributions from elements      for (i=0;i<nle;i++){      ndofe=Mt->elements[loe[i].ide].ndofe;      cn = new long [ndofe];      Mt->give_code_numbers (loe[i].ide,cn);            for (j=0;j<ndofe;j++){      k=cn[j]-1;      if (k<0)  continue;      else  rhs[k]+=loe[i].fe[j];      }      }      */                  //  contributions from prescribed displacements      if (npd>0){	long ne = Mt->ne;	for (i=0;i<ne;i++){	  if (Mt->elements[i].prescdispl==1){	    ndofe=Mt->give_ndofe (i);	    allocm (ndofe,ndofe,sm);	    stiffmat (i,lcid,sm);	    	    r.a = new double [ndofe];  r.n=ndofe;	    f.a = new double [ndofe];  f.n=ndofe;	    cn = new long [ndofe];	    Mt->give_code_numbers (i,cn);	    eldispl (lcid,i,r.a,cn,ndofe);	    mxv (sm,r,f);	    cmulv (-1.0,f);	    locglob (rhs,f.a,cn,ndofe);	    destrm (sm);	    delete [] cn;	    //delete [] f.x;  delete [] r.x;	  }	}      }            break;    }      default:{    fprintf (stderr,"\n\n unknown type of load case is required in function assemble (file %s, line %d).\n",	     __FILE__,__LINE__);  }  }  }/**   function assembles vector of right hand side with respect of left hand side      @param rhs - right hand side vector   @param lhs - left hand side   26.10.2001*/void dloadcase::assemble (double *rhs, double *lhs){  long i,j,k,ndofn;  vector r,f;  matrix sm;  //nullv (rhs,Ndofm);  //  contributions from nodes  for (i=0;i<nln;i++){    ndofn=Mt->give_ndofn (lon[i].idn);    for (j=0;j<ndofn;j++){      k=Mt->give_dof (lon[i].idn,j);      if (k<=0)  continue;      if (k>0)  rhs[k-1]+=lon[i].getval(lhs[k-1], j);    }  }}/**   function evaluates reactions      @param lcid - load case id   */void dloadcase::compute_reactions (long lcid){  long i,j,k,nne,ndofn,ne,te,ndofe,*cn;  double *r,*f;  ivector *nod;  matrix sm;  ne=Mt->ne;  for (i=0;i<ne;i++){    if (Mt->elements[i].react==1){      te = Mt->give_elem_type (i);      ndofe=Mt->give_ndofe (i);      allocm (ndofe,ndofe,sm);      stiffmat (i,lcid,sm);            r = new double [ndofe];      f = new double [ndofe];      cn = new long [ndofe];      Mt->give_code_numbers (i,cn);      eldispl (lcid,i,r,cn,ndofe);      mxv (sm.a,r,f,ndofe,ndofe);      nne=Mt->give_nne (i);            nod = new ivector (nne);      Mt->give_elemnodes (i,*nod);      long ii=0;      for (j=0;j<nne;j++){	ndofn=Mt->give_ndofn (nod->a[j]);	if (Mt->nodes[nod->a[j]].react==1){	  for (k=0;k<ndofn;k++){	    Mt->nodes[nod->a[j]].r[k]+=f[ii];	    ii++;	  }	}	else  ii+=ndofn;      }            destrm (sm);      delete [] r;  delete [] f;  delete [] cn;  delete [] nod;    }  }  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -