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

📄 nonlinman.cpp

📁 Finite element program for mechanical problem. It can solve various problem in solid problem
💻 CPP
字号:
#include <string.h>#include "nonlinman.h"nonlinman::nonlinman (void){  /*  tnlinsol = (nonlinsolvertype) 0;  displnorm = (displacementnorm) 0;  nial = 0;  niilal = 0;  erral = 0.0;  dlal = 0.0;  dlmaxal = 0.0;  psial = 0.0;  nsnal=0;  selnodal=NULL;  hdbackupal=0;  nsdofal=0;  seldofal=NULL;  ninr = 0;  niilnr = 0;  errnr = 0.0;  incrnr = 0.0;  minincrnr = 0.0;  */  errl = 0.0;  nienr = 0;  hdbr = 0;  hdbid = 0;  backupfname[0] = 0;    selnodal=NULL;  seldofal=NULL;}nonlinman::~nonlinman (void){  delete [] selnodal;  delete [] seldofal;}void nonlinman::read (XFILE *in,long mespr){  //  type of nonlinear solver  xfscanf (in,"%k%d","type_of_nonlin_solver",(int*)&tnlinsol);    switch (tnlinsol){  case arcl:  case adaptram:  case arclrv1:  case arclrv:    {      if (mespr==1)  fprintf (stdout,"\n system of nonlinear equations will be solved by arc-length method");      xfscanf (in,"%ld %ld %lf %lf %lf %lf %lf",&nial,&niilal,&erral,&dlal,&dlminal,&dlmaxal,&psial);      if ((tnlinsol == arclrv1) || (tnlinsol == arclrv))        xfscanf(in, "%lf", &rvlam);      if (tnlinsol == arclrv)        xfscanf(in, "%lf", &errl);      xfscanf (in,"%ld %d",&hdbackupal,(int*)&displnorm);            switch (displnorm){      case alldofs:{  break; }      case seldofs:{        xfscanf (in,"%ld",&nsdofal);        selnodal = new long [nsdofal];        seldofal = new long [nsdofal];        read_seldof (in);        break;      }      case seldofscoord:{        xfscanf (in,"%ld",&nsdofal);        selnodal = new long [nsdofal];        seldofal = new long [nsdofal];        selnodcoord = new double [3*nsdofal];        read_seldofcoord (in);        break;      }      case selecnodes:{        xfscanf (in,"%ld",&nsnal);        selnodal = new long [nsnal];        read_selnod (in);        break;      }      case nodesdistincr:{        nsnal=2;        xfscanf (in,"%ld",&probdimal);        selnodal = new long [nsnal];        read_selnod (in);        break;      }      default:{        fprintf (stderr,"\n\n unknown norm measurement of displacement increment (file %s, line %d).\n",__FILE__,__LINE__);      }      }            break;    }  case newton:{    if (mespr==1)  fprintf (stdout,"\n system of nonlinear equations will be solved by Newton-Raphson method");    xfscanf (in,"%ld %ld %lf %lf %lf %lf",&ninr,&niilnr,&errnr,&incrnr,&minincrnr,&maxincrnr);    break;  }  case newtonrv1:{    if (mespr==1)  fprintf (stdout,"\n system of nonlinear equations will be solved by Newton-Raphson method");    xfscanf (in,"%ld %ld %lf %lf %lf %lf",&ninr,&niilnr,&errnr,&incrnr,&minincrnr, &rvlam);    if (mespr==1)  fprintf(stdout, "\n requried value of lambda=% e", rvlam);    break;  }  case newtonrestart:{    if (mespr==1)  fprintf (stdout,"\n system of nonlinear equations will be solved by Newton-Raphson method with ");    xfscanf (in,"%ld %ld %lf %lf %lf",&ninr,&niilnr,&errnr,&incrnr,&minincrnr);    xfscanf (in, "%ld %ld", &nienr, &hdbr);    if (hdbr)      xfscanf(in, "%s %ld", backupfname, &hdbid);    if ((mespr==1) && (hdbr))  fprintf(stdout, "\n restart will be performed from file : %s\n record number : %ld\n", backupfname, hdbid);    break;  }  case displctrl:{    if (mespr==1)  fprintf (stdout,"\n system of nonlinear equations will be solved by Newton-Raphson method with displacement control");    xfscanf (in,"%ld %ld %lf %lf %lf",&ninr,&niilnr,&errnr,&incrnr,&minincrnr);    break;  }  case displctrlrv:{    if (mespr==1)  fprintf (stdout,"\n system of nonlinear equations will be solved by Newton-Raphson method with displacement control");    xfscanf (in,"%ld %ld %lf %lf %lf %lf %lf",&ninr,&niilnr,&errnr,&incrnr,&minincrnr,&rvlam,&errl);    if (mespr==1)  fprintf(stdout, "\n requried value of lambda=% e, required error of lambda=% e", rvlam, errl);    break;  }  default:{    fprintf (stderr,"\n\n unknown solver of nonlinear system of equations");    fprintf (stderr,"\n is required in function probdesc::read (file %s, line %d).\n",__FILE__,__LINE__);  }  }  }void nonlinman::print (FILE *out){  fprintf (out,"%d\n",(int)tnlinsol);    switch (tnlinsol){  case arcl:  case arclrv1:{    fprintf (out, "%ld %ld %e %e %e %e %e\n", nial, niilal, erral, dlal,	     dlminal, dlmaxal, psial);    if ((tnlinsol == arclrv1) || (tnlinsol == arclrv))      fprintf(out, "%f\n", rvlam);    if (tnlinsol == arclrv)      fprintf(out, "%f\n", errl);        fprintf (out,"%ld %d\n",hdbackupal,displnorm);        switch (displnorm){    case alldofs:{  break; }    case seldofs:{      fprintf (out,"%ld\n",nsdofal);      print_seldof (out);      break;    }    case seldofscoord:{      fprintf (out,"%ld\n",nsdofal);      print_seldofcoord (out);      break;    }    case selecnodes:{      fprintf (out,"%ld\n",nsnal);      print_selnod (out);      break;    }    case nodesdistincr:{      nsnal=2;      fprintf (out,"%ld\n",probdimal);      print_selnod (out);      break;    }    default:{      fprintf (stderr,"\n\n unknown norm measurement of displacement increment \n");    }    }        break;  }  case newton:{    fprintf (out, "%ld %ld %e %e %e\n", ninr, niilnr, errnr, incrnr, minincrnr);    break;        }  case newtonrv1:{    fprintf (out, "%ld %ld %e %e %e %e\n", ninr, niilnr, errnr, incrnr, minincrnr, rvlam);    break;  }  case newtonrestart:{    fprintf (out,"%ld %ld %e %e %e\n",ninr,niilnr,errnr,incrnr,minincrnr);    fprintf (out, "%ld %ld\n", nienr, hdbr);    if (hdbr)      fprintf(out, "%s\n %ld\n", backupfname, hdbid);    break;  }  case displctrl:{    fprintf (out, "%ld %ld %e %e %e\n", ninr, niilnr, errnr, incrnr, minincrnr);    break;        }  case displctrlrv:{    fprintf (out,"%ld %ld %lf %lf %lf %lf %lf\n",ninr,niilnr,errnr,incrnr,minincrnr,rvlam,errl);    break;  }  default:{}  }  }void nonlinman::read_selnod (XFILE *in){  long i;    for (i=0;i<nsnal;i++){    xfscanf (in,"%ld",selnodal+i);    selnodal[i]--;  }  }void nonlinman::read_seldof (XFILE *in){  long i;    for (i=0;i<nsdofal;i++){    xfscanf (in,"%ld %ld",selnodal+i,seldofal+i);    selnodal[i]--;  seldofal[i]--;  }  }void nonlinman::read_seldofcoord (XFILE *in){  long i;  for (i=0;i<nsdofal;i++){    xfscanf (in,"%lf %lf %lf %ld",selnodcoord+3*i,selnodcoord+3*i+1,selnodcoord+3*i+2,seldofal+i);    seldofal[i]--;  }}void nonlinman::print_selnod (FILE *out){  long i;    for (i=0;i<nsnal;i++){    fprintf (out,"%ld\n",selnodal[i]+1);  }  }void nonlinman::print_seldof (FILE *out){  long i;    for (i=0;i<nsdofal;i++){    fprintf (out,"%ld %ld\n",selnodal[i]+1,seldofal[i]+1);  }  }void nonlinman::print_seldofcoord (FILE *out){  long i;    for (i=0;i<nsdofal;i++){    fprintf (out,"%f %f %f %ld\n",selnodcoord[3*i],selnodcoord[3*i+1],selnodcoord[3*i+2],seldofal[i]+1);  }  }void nonlinman::initiate (nonlinman &nm){  long i;  tnlinsol = nm.tnlinsol;  //  ARC-LENGTH METHOD  displnorm = nm.displnorm;  hdbackupal = nm.hdbackupal;  nial = nm.nial;  niilal = nm.niilal;  erral = nm.erral;  dlal = nm.dlal;  dlminal = nm.dlminal;  dlmaxal = nm.dlmaxal;  psial = nm.psial;    nsnal = nm.nsnal;  nsdofal = nm.nsdofal;  probdimal = nm.probdimal;  nxal = nm.nxal;  nyal = nm.nyal;  nzal = nm.nzal;      switch (displnorm){  case alldofs:{  break; }  case seldofs:{    selnodal = new long [nsdofal];    seldofal = new long [nsdofal];        for (i=0;i<nsdofal;i++){      selnodal[i]=nm.selnodal[i];      seldofal[i]=nm.seldofal[i];    }        break;  }  case seldofscoord:{    seldofal = new long [nsdofal];    selnodcoord = new double [3*nsdofal];        for (i=0;i<nsdofal;i++){      selnodcoord[3*i]=nm.selnodcoord[3*i];      selnodcoord[3*i+1]=nm.selnodcoord[3*i+1];      selnodcoord[3*i+2]=nm.selnodcoord[3*i+2];      seldofal[i]=nm.seldofal[i];    }        break;  }  case selecnodes:{    selnodal = new long [nsnal];        for (i=0;i<nsnal;i++){      selnodal[i]=nm.selnodal[i];    }        break;  }  case nodesdistincr:{    nsnal=2;    selnodal = new long [nsnal];        for (i=0;i<nsnal;i++){      selnodal[i]=nm.selnodal[i];    }        break;  }  default:{    fprintf (stderr,"\n\n unknown norm measurement of displacement increment (file %s, line %d).\n",__FILE__,__LINE__);  }  }      //  NEWTON-RAPHSON METHOD  ninr = nm.ninr;  niilnr = nm.niilnr;  errnr = nm.errnr;  incrnr = nm.incrnr;  minincrnr = nm.minincrnr;  rvlam = nm.rvlam;  nienr = nm.nienr;  hdbr  = nm.hdbr;  if (hdbr)  {    hdbid = nm.hdbid;    for (i=0; i < long(strlen(nm.backupfname)); i++)      backupfname[i] = nm.backupfname[i];  }}

⌨️ 快捷键说明

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