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

📄 slopesol.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            Mm->updateipval();          break; 	}      }      modif=0;      if (stop==0){	//  modification of the arc length	dl/=2.0;	if (dl<dlmin){          dl=dlmin;            if (nodiv_dl)                 break;           else            nodiv_dl = 1;        }	if (Mespr==1){	  fprintf (stdout,"\n arc length must be modified (dl decrease) dl=%e    norf=%e",dl,norf);//	  fprintf (Out,"\n arc length must be modified (dl decrease) dl=%e    norf=%e",dl,norf);	}	//  restoring of left hand side vector        copyv (r, ra, n);	//  restoring of lambda parameter	lambda=blambda;      }    }  }    // ------------------------------------  //  finish of main iteration loop  ----  // ------------------------------------    if (Mp->nlman.hdbackupal==1)    arclsave (i,n,lambda,dl,ra,fp);  // termit  if (Mp->adaptivity)    if (i < ni)      arclsave_adapt (i,lambda,0,dl);    else      if (Mp->nlman.hdbackupal%10 == 1)	arclsave (i,n,lambda,dl,ra,fp);    if ((Mp->adaptflag & 16) && (Mp->nlman.nial==100 || Mp->nlman.nial==1))    Ada->run (0,0,0);      delete [] r;		      delete [] fi;    delete [] fa;    delete [] f;  delete [] v;    delete [] u;    delete [] ddr;    return (i);}void newton_raphsonrv1 (long lcid, double rlambda, double rlerr)  //  function solves system of nonlinear algebraic  //  equations by Newton-Raphson method  //  solved system does not contain time variable  //  //  16.8.2001{  long i,j,k,n,ni,ini;  double lambda,blambda,dlambda,dlambdamin,zero,err,norf,norfa;  double *r,*rb,*dr,*f,*fi,*fb,*fc,*fp;  long back_incr = 1;  long check_rv = 1;  double binc;  //  number of rows of the matrix  n = Ndofm;  //  maximum number of increments  ni = Mp->nlman.ninr;  //  maximum number of iterations in one increment  ini = Mp->nlman.niilnr;  //  computer zero  zero = Mp->zero;  //  required error in inner loop  err = Mp->nlman.errnr;  //  increment size  dlambda=Mp->nlman.incrnr;  //  minimum increment size  dlambdamin=Mp->nlman.minincrnr;  rb = new double [n];  f  = new double [n];  fb = new double [n];  fi = new double [n];  dr = new double [n];  memset (rb,0,n*sizeof(double));  memset (f,0,n*sizeof(double));  memset (fi,0,n*sizeof(double));  memset (dr,0,n*sizeof(double));    //  initialization phase  r  = Lsrs->give_lhs (lcid);  fp = Lsrs->give_rhs (lcid*2);  fc = Lsrs->give_rhs (lcid*2+1);  lambda=0.0;    // ***************************  //  main iteration loop  ****  // ***************************  print_init(-1, "wt");  print_step(lcid, 0, 0.0, f);  print_flush();  for (i=0;i<ni;i++){        //  backup of left hand side vector    for (j=0;j<n;j++){      rb[j]=r[j];    }    //  backup of reached lambda parameter    blambda=lambda;    if (back_incr)      binc = dlambda;       fprintf (stdout,"\n increment %ld   lambda %e,    dlambda %e",i,lambda,dlambda);        //  vector of maximum load and vector of load increment    for (j=0;j<n;j++){/*      if (check_rv)      {        f[j]=lambda*(fp[j]+fc[j]);        fb[j]=dlambda*(fp[j]+fc[j]);      }      else      {        f[j]=rlambda*fc[j]+lambda*fp[j];        fb[j]=dlambda*fp[j];      }*/      if (check_rv)      {        f[j]=lambda*(fc[j]);        fb[j]=dlambda*(fc[j]);      }      else      {        f[j]=rlambda*fc[j]+(lambda-rlambda)*fp[j];        fb[j]=dlambda*fp[j];      }    }        //  assembling of tangent stiffness matrix    if ((Mp->stmat==tangent_stiff) || (i == 0))      stiffness_matrix (lcid);        //  solution of K(r).v=F    //Smat->solve_system (Gtm,dr,fb);    Mp->ssle.solve_system (Gtm,Smat,dr,fb,Out);    for (j=0;j<n;j++){      r[j]+=dr[j];    }        //  computation of internal forces    internal_forces (lcid,fi);        //  vector of unbalanced forces    for (j=0;j<n;j++){/*      if (check_rv)        fb[j]=f[j]+dlambda*(fp[j]+fc[j]);      else        fb[j]=f[j]+dlambda*fp[j];*/      if (check_rv)        fb[j]=f[j]+dlambda*(fc[j]);      else        fb[j]=f[j]+dlambda*fp[j];    }    norfa=ss(fb,fb,n);    for (j=0;j<n;j++){      fb[j] -= fi[j];    }    //  norm of vector of unbalanced forces    norf=ss(fb,fb,n);    norf /= norfa;        if (norf<err){      lambda+=dlambda;      if (check_rv && ((lambda - rlambda) > 0.0) && (fabs(lambda-rlambda) > rlerr))      {        if (back_incr)	{          binc = dlambda;          back_incr = 0;	}        //  modification of the newton-rhapson        dlambda/=2.0;        if (dlambda<=dlambdamin)        {          if (dlambda == dlambdamin)            break;          dlambda=dlambdamin;        }        if (Mespr==1)          fprintf (stdout,"\n increment must be modified (dlambda decrease) dlambda=%e    norf=%e",dlambda,norf);        //  restoring of left hand side vector        for (j=0;j<n;j++)          r[j]=rb[j];        //  restoring of lambda parameter        lambda=blambda;      }      if (fabs(lambda-rlambda) <= rlerr)      {        dlambda = binc;        check_rv = 0;      }      Mm->updateipval ();      compute_req_val (lcid);      print_step(lcid, i+1, lambda, f);      print_flush();      continue;    }        //  internal iteration loop    for (j=0;j<ini;j++) {            //  solution of K(r).v=F      //Smat->solve_system (Gtm,dr,fb);      Mp->ssle.solve_system (Gtm,Smat,dr,fb,Out);      for (k=0;k<n;k++){	r[k]+=dr[k];      }            //  computation of internal forces      internal_forces (lcid,fi);            //  vector of unbalanced forces      for (k=0;k<n;k++){/*        if (check_rv)          fb[k]=f[k]+dlambda*(fp[k]+fc[k])-fi[k];        else          fb[k]=f[k]+dlambda*fp[k]-fi[k];*/        if (check_rv)          fb[k]=f[k]+dlambda*(fc[k])-fi[k];        else          fb[k]=f[k]+dlambda*fp[k]-fi[k];      }            //  norm of vector of unbalanced forces      norf=ss(fb,fb,n);      norf /= norfa;            fprintf (stdout,"\n increment %ld   inner loop j %ld     norf=%e  dlambda %e",i,j,norf,dlambda);            if (norf<err)  break;    }        if (j==ini || norf>err){      if (dlambda == dlambdamin)      {	fprintf (stdout,"\n increment of lambda cannot be decreased, iteration will be stopped\n");	break;      }              dlambda/=2.0;      if (dlambda<dlambdamin)  dlambda=dlambdamin;      if (Mespr==1)	fprintf (stdout,"\n increment must be modified (dlambda decrease) dlambda=%e    norf=%e",dlambda,norf);            for (j=0;j<n;j++){      	r[j]=rb[j];      }      lambda=blambda;    }    else{      lambda+=dlambda;      if (check_rv && ((lambda - rlambda) > 0.0) && (fabs(lambda-rlambda) > rlerr))      {        if (back_incr)	{          binc = dlambda;          back_incr = 0;	}        //  modification of the newton-rhapson        dlambda/=2.0;        if (dlambda<=dlambdamin)        {          if (dlambda == dlambdamin)            break;          dlambda=dlambdamin;        }        if (Mespr==1)          fprintf (stdout,"\n increment must be modified (dlambda decrease) dlambda=%e    norf=%e",dlambda,norf);        //  restoring of left hand side vector        for (j=0;j<n;j++)          r[j]=rb[j];        //  restoring of lambda parameter        lambda=blambda;      }      if (fabs(lambda-rlambda) <= rlerr)      {        if (back_incr == 0)          dlambda = binc;        check_rv = 0;      }      Mm->updateipval ();      compute_req_val (lcid);      print_step(lcid, i+1, lambda, f);      print_flush();    }      }    delete [] dr;  delete [] fi;  delete [] fb;  delete [] f;  print_close();}

⌨️ 快捷键说明

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