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

📄 nfssolver.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 4 页
字号:
#include "nfssolver.h"#include "nssolver.h"#include "global.h"#include "globmat.h"#include "loadcase.h"#include "gmatrix.h"#include "mechprint.h"#include "flsubdom.h"#include "mathem.h"/**   function solves linear problem with floating subdomains   it may be used for pull-out tests      JK, 5.11.2005*/void solve_incremental_floating_subdomains (){  long i,lcid,n,nincr;  double *d,*lhs,*rhs;    //  load case id, must be zero  lcid=0;  //  number of unknowns  n=Ndofm;  //  number of increments  nincr=Mp->nincr;  Fsd = new flsubdom;    //  array of nodal displacements  lhs=Lsrs->give_lhs (lcid);  //  array of nodal forcess  rhs=Lsrs->give_rhs (lcid);  //  array of increments of nodal displacements  d = new double [n];    //  assembling of the right hand side  mefel_right_hand_side (lcid,rhs);    //  assembling of the stiffness matrix  stiffness_matrix (lcid);    Fsd->initialization (Ndofm,Mp->ense,rhs);    print_init(-1, "wt");      for (i=0;i<nincr;i++){        Fsd->solve_lin_alg_system (lhs,rhs);        addv (lhs,d,n);        Fsd->add_mult (1.0);    Fsd->mult_correction ();        for (i=0;i<Lsrs->nlc;i++){      //compute_ipstrains (i);      //compute_ipstresses (i);      compute_req_val (i);      print_step(i, 0, 0.0, NULL);        }      }    print_close();    }/**   function solves nonlinear problem of floating subdomain   the nonlinearity is hidden in contact stresses and in   material models, like plasticity, etc.      function solves the problem by the arc-length method (continuation method)   this function is modification of the function arclength   from the file nssolver.cpp   d stands for delta   dd stands for capital delta      fc - nonproportional %vector   fp - proportional %vector   n - number of unknowns      JK, 24.6.2006*//*void solve_nonlinear_floating_subdomains (){  long i,j,k,n,l,ni,ini,stop,modif,li,newmesh,numr,lcid,nlm;  double a0,a1,a2,l1,l2,dl,dlmax,dlmin,psi,lambda,blambda,dlambda,ddlambda,norf,norfp,norv,norfa,zero,ierr;  double lambdao,ss1,ss2,ss3,ss4,ss5;  double *r,*ra,*ddr,*u,*v,*f,*fa,*fp,*fc,*fi,*rhs,*blm;    //  allocation of object floating subdomains  Fsd = new flsubdom;    //  only one load case can be solved  //  it is nonlinear computation and the superposition is useless  lcid=0;    //  number of rows of the matrix  n = Ndofm;  //  maximum number of increments  ni = Mp->nlman.nial;  //  maximum number of iterations in one increment  ini = Mp->nlman.niilal;  //  computer zero  zero = Mp->zero;  //  required error in inner loop  ierr = Mp->nlman.erral;  //  length of arc  dl = Mp->nlman.dlal;  //  maximum length of arc  dlmax = Mp->nlman.dlmaxal;  //  minimum length of arc  dlmin = Mp->nlman.dlminal;  //  displacement-loading driving switch  psi = Mp->nlman.psial;    //  array for right hand side  rhs=Lsrs->give_rhs (0);  //  assembling of right hand side (load vector)  mefel_right_hand_side (lcid,rhs);    dlambda=0.0;    //  allocation of auxiliary arrays  r = new double [n];  ddr = new double [n];  u = new double [n];  v = new double [n];  f = new double [n];  fa = new double [n];  fi = new double [n];    //  initialization phase  //  vector of nodal displacements  ra = Lsrs->give_lhs (lcid);  //  vector of proportional load  fp = Lsrs->give_rhs (lcid*2);  //  vector of nonproportional load  fc = Lsrs->give_rhs (lcid*2+1);      if (Mp->nlman.hdbackupal == 2){            // termit    arclopen (li,n,lambda,dl,ra,fp);  }  else{    lambda=0.0;    lambdao=0.0;    li=0;  }      //  norm of proportionality vector  norfp = ss(fp,fp,n);  modif=0;      // assembling reached load vector  for (j=0;j<n;j++){    fa[j]=fc[j]+(lambda+dlambda)*fp[j];  }  if (li)    print_init(-1, "at");  else    {      print_init(-1, "wt");      print_step(lcid, li, lambda, fa);    }      //  assembling of stiffness matrix  stiffness_matrix (lcid);    //  initialization of FETI method  //  determination of number of Lagrange multipliers  //  computation of rigid body motions  Fsd->initialization (Ndofm,Mp->ense,f);  //  number of Lagrange multipliers  nlm = Fsd->nlm;        // ***************************  //  main iteration loop  ****  // ***************************  for (i=li;i<ni;i++){        fprintf (Out,"\n\n arc-length  prirustek %ld",i);        stop=1; // termit    //  backup of left hand side vector    copyv (ra, r, n);    //  backup of reached lambda parameter    blambda=lambda;    //  backup of reached Lagrange multipliers    copyv (Fsd->tw,blm,nlm);    //fprintf (stdout,"\n\n arc-length: increment %ld   lambda %e  dl %e",i,lambda,dl);//    if (Mespr==1){//  fprintf (Out,"\n\n *******************************************************************");//  fprintf (Out,"\n arc-length: increment %ld,   lambda=%e   dl=%e",i,lambda,dl);//  }          //  assembling of tangent stiffness matrix    if ((Mp->stmat==tangent_stiff) || (i == li)){      //stiffness_matrix (lcid);      //Fsd->initialization (Ndofm,Mp->ense,f);    }        stiffness_matrix (lcid);        //  backup of the fp, in ldl_sky the right hand side will be destroyed    copyv(fp, f, n);        Fsd->initialization (Ndofm,Mp->ense,f);        Fsd->solve_lin_alg_system (v,f);        //  solution of K(r).v=F    //Smat->solve_system (v,f);        //  generalized norm of displacement increments    norv = displincr (v,n);        //  compute new dlambda increment    dlambda = dl/sqrt(norv+psi*psi*norfp);        Fsd->add_mult (dlambda);    Fsd->mult_correction ();        //  novinka    if (Fsd->nch!=0){      for (j=0;j<ini;j++){	fprintf (stdout,"\n cyklime v casti jedna  %ld",j);	//  restoring of Lagrange multipliers	copyv (blm,Fsd->tw,nlm);		Fsd->solve_lin_alg_system (v,f);		//  generalized norm of displacement increments	norv = displincr (v,n);		//  compute new dlambda increment	dlambda = dl/sqrt(norv+psi*psi*norfp);		Fsd->add_mult (dlambda);	Fsd->mult_correction ();		if (Fsd->nch==0)	  break;      }    }    //  konec novinky            for (j=0;j<n;j++){      ddr[j]=dlambda*v[j];      ra[j]+=ddr[j];      fa[j]=fc[j]+(lambda+dlambda)*fp[j];    }    ddlambda=dlambda;        //  computation of internal forces    internal_forces (lcid,fi);    subv(fa, fi, f, n);        norf=sizev(f,n);    norfa = sizev(fa, n);    //if (norfa<1.0e-8){}    //else norf /= norfa;    norf /= norfa;            //if (Mespr==1)  fprintf (stdout,"\n ddlambda %e    dlambda %e   norf %e  ierr %e",ddlambda,dlambda,norf,ierr);    if (Mespr==1)  fprintf (stdout,"\n increment %ld     norv %e      norf %e",i,norv,norf);        if (norf<ierr){      // ******************************************      //  no inner iteration loop is required  ***      // ******************************************      modif++;            if (modif>1){	//  arc length modification	dl*=2.0;	if (dl>dlmax)            dl=dlmax;	modif=0;	if (Mespr==1){	  fprintf (stdout,"\n arc-length must be modified (dl increase) dl=%e",dl);	  //	  fprintf (Out,"\n arc-length must be modified (dl increase) dl=%e",dl);	}      }      lambda+=dlambda;      Mm->updateipval ();      compute_req_val (lcid);      print_step(lcid, i+1, lambda, fa);      print_flush();    }    else{      // ****************************      //  inner iteration loop  ****      // ****************************      stop=0;      for (j=0;j<ini;j++){	if (Mp->stmat==tangent_stiff){	  stiffness_matrix (lcid);	  Fsd->initialization (Ndofm,Mp->ense,f);	}		fprintf (Out,"\n arc-length  vnitrni smycka  %ld %ld",i,j);		        copyv(f, buf, n);		Fsd->solve_lin_alg_system (u,f);		//  back substitution	//Smat->solve_system (u,f);		//  backup of the vector ddr        copyv(ddr, buddr, n);		        copyv(ddr, f, n);        addv(ddr, u, n);	//  coefficient of quadratic equation	quadeqcoeff (ddr,v,n,ddlambda,psi,norfp,dl,a0,a1,a2);		//  solution of quadratic equation        numr = solv_polynom_2(a2, a1, a0, l1, l2);        switch (numr)	{	  case -1 :            fprintf (stderr,"\n\n infinite number of solution of constrained condition in function arclength");            break;	  case 0 :            fprintf (stderr,"\n\n nonsolvable constrained condition in function arclength");            break;    	  case 1 :            dlambda = l1;            break;	  default :            break;	}	ss1=0.0;  ss2=0.0;	ss3=0.0;  ss4=0.0;  ss5=0.0;	for (k=0;k<n;k++){	  ss1+=(ddr[k]+l1*v[k])*f[k];	  ss2+=(ddr[k]+l2*v[k])*f[k];	  ss3+=(ddr[k]+l1*v[k])*(ddr[k]+l1*v[k]);	  ss4+=(ddr[k]+l2*v[k])*(ddr[k]+l2*v[k]);	  ss5+=f[k]*f[k];	}		if (fabs(l1)>fabs(l2))  dlambda=l2;	else dlambda=l1;		copyv (Fsd->tw,bulm,nlm);	Fsd->add_mult (dlambda);	Fsd->mult_correction ();		//  novinka	if (Fsd->nch!=0){	  for (l=0;l<ini;l++){	    	    fprintf (stdout,"\n cyklime v casti dve  %ld",j);	    	    	    //  restoring of Lagrange multipliers	    copyv (bulm,Fsd->tw,nlm);	    copyv (buddr,ddr,n);	    copyv (buf,f,n);	    	    Fsd->solve_lin_alg_system (u,f);	    	    copyv(ddr, f, n);	    addv(ddr, u, n);	    //  coefficient of quadratic equation	    quadeqcoeff (ddr,v,n,ddlambda,psi,norfp,dl,a0,a1,a2);	    	    //  solution of quadratic equation	    numr = solv_polynom_2(a2, a1, a0, l1, l2);	    switch (numr)	      {	      case -1 :		fprintf (stderr,"\n\n infinite number of solution of constrained condition in function arclength");		break;	      case 0 :		fprintf (stderr,"\n\n nonsolvable constrained condition in function arclength");		break;	      case 1 :		dlambda = l1;		break;	      default :		break;	      }	    ss1=0.0;  ss2=0.0;	    ss3=0.0;  ss4=0.0;  ss5=0.0;	    for (k=0;k<n;k++){	      ss1+=(ddr[k]+l1*v[k])*f[k];	      ss2+=(ddr[k]+l2*v[k])*f[k];	      ss3+=(ddr[k]+l1*v[k])*(ddr[k]+l1*v[k]);	      ss4+=(ddr[k]+l2*v[k])*(ddr[k]+l2*v[k]);	      ss5+=f[k]*f[k];	    }	    	    if (fabs(l1)>fabs(l2))  dlambda=l2;	    else dlambda=l1;	    	    	    Fsd->add_mult (dlambda);	    Fsd->mult_correction ();	    	    if (Fsd->nch==0)	      break;	  }	}	//  konec novinky	for (k=0;k<n;k++){	  ddr[k]+=dlambda*v[k];	  ra[k]+=u[k]+dlambda*v[k];	  fa[k]+=dlambda*fp[k];	}	ddlambda+=dlambda;		//fprintf (stdout,"   ddlambda %e",ddlambda);		//fprintf (Out,"\n ddlambda %e     dlambda %e",ddlambda,dlambda);	//  computation of internal forces	internal_forces (lcid,fi);        subv(fa, fi, f, n);		norf=sizev(f,n);	norfa = sizev(fa, n);	norf /= norfa;	//if (norfa<1.0e-8){}	//else norf /= norfa;		if (Mespr==1){	  fprintf (stdout,"\n    norf=%e  ierr=%e",norf,ierr);	  //fprintf (Out,"\n increment  %ld     inner loop  %ld    norf=%e",i,j,norf);	}	if (norf<ierr){	  lambda+=ddlambda;	  Mm->updateipval ();	  stop=1; 	  compute_req_val (lcid);          print_step(lcid, i+1, lambda, fa);          print_flush();	  break;	}      }      modif=0;      if (stop==0){	//  modification of the arc length	dl/=2.0;	if (dl<dlmin){          dl=dlmin;            break;         }	if (Mespr==1){	  fprintf (stdout,"\n arc length must be modified (dl decrease) dl=%e",dl);	  //fprintf (Out,"\n arc length must be modified (dl decrease) dl=%e",dl);	}	//  restoring of left hand side vector        copyv(r, ra, n);	//  restoring of lambda parameter	lambda=blambda;	//  restoring of Lagrange multipliers	copyv (blm,Fsd->tw,nlm);      }    }        fprintf (stdout,"\n increment %ld    total lambda %e",i,lambda);    if (stop==0)      continue;      }    // ------------------------------------  //  finish of main iteration loop  ----  // ------------------------------------      fprintf (stdout,"\n\n multiplikatory   %lf",Fsd->tw[0]);    if (Mp->nlman.hdbackupal==1)    arclsave (i,n,lambda,dl,ra,fp);  print_close();  delete [] r;		      delete [] fi;    delete [] fa;    delete [] f;  delete [] v;    delete [] u;    delete [] ddr;  }*//**   function solves nonlinear problem of floating subdomain   the nonlinearity is hidden in contact stresses and in   material models, like plasticity, etc.      function solves the problem by the arc-length method (continuation method)   this function is modification of the function arclength   from the file nssolver.cpp   d stands for delta   dd stands for capital delta      fc - nonproportional %vector   fp - proportional %vector   n - number of unknowns   

⌨️ 快捷键说明

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