📄 nonlinman.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 + -