00001 #include <string.h> 00002 #include "nonlinmant.h" 00003 00004 nonlinmant::nonlinmant (void) 00005 { 00006 /* 00007 tnlinsol = (nonlinsolvertype) 0; 00008 displnorm = (displacementnorm) 0; 00009 00010 nial = 0; niilal = 0; erral = 0.0; dlal = 0.0; dlmaxal = 0.0; psial = 0.0; 00011 nsnal=0; selnodal=NULL; hdbackupal=0; nsdofal=0; seldofal=NULL; 00012 00013 ninr = 0; niilnr = 0; errnr = 0.0; incrnr = 0.0; minincrnr = 0.0; 00014 */ 00015 /* 00016 errl = 0.0; 00017 nienr = 0; 00018 hdbr = 0; 00019 hdbid = 0; 00020 backupfname[0] = 0; 00021 00022 selnodal=NULL; 00023 seldofal=NULL; 00024 */ 00025 } 00026 00027 nonlinmant::~nonlinmant (void) 00028 { 00029 /* 00030 delete [] selnodal; 00031 delete [] seldofal; 00032 */ 00033 } 00034 00035 void nonlinmant::read (XFILE *in,long mespr) 00036 { 00037 // type of nonlinear solver 00038 xfscanf (in,"%k%d","type_of_nonlin_solver",(int*)&tnlinsol); 00039 00040 switch (tnlinsol){ 00041 case newtont:{ 00042 // maximum number of increments 00043 // maximum number of iterations in inner loop 00044 // required norm of residual 00045 // magnitude of increment of loading 00046 // minimum magnitude of increment of loading 00047 // maximum magnitude of increment of loading 00048 if (mespr==1) fprintf (stdout,"\n system of nonlinear equations will be solved by Newton-Raphson method"); 00049 xfscanf (in,"%ld %ld %lf %lf %lf %lf",&ninr,&niilnr,&errnr,&incrnr,&minincrnr,&maxincrnr); 00050 break; 00051 } 00052 default:{ 00053 print_err("unknown solver of nonlinear system of equations",__FILE__,__LINE__,__func__); 00054 } 00055 } 00056 00057 } 00058 00059 void nonlinmant::print (FILE *out) 00060 { 00061 fprintf (out,"%d\n",(int)tnlinsol); 00062 00063 switch (tnlinsol){ 00064 case newtont:{ 00065 fprintf (out, "%ld %ld %e %e %e %e\n", ninr, niilnr, errnr, incrnr, minincrnr, maxincrnr); 00066 break; 00067 } 00068 default:{ 00069 print_err("unknown solver of nonlinear system of equations",__FILE__,__LINE__,__func__); 00070 } 00071 } 00072 00073 } 00074 00075 /* 00076 void nonlinmant::initiate (nonlinmant &nm) 00077 { 00078 long i; 00079 00080 tnlinsol = nm.tnlinsol; 00081 00082 // ARC-LENGTH METHOD 00083 displnorm = nm.displnorm; 00084 hdbackupal = nm.hdbackupal; 00085 nial = nm.nial; 00086 niilal = nm.niilal; 00087 erral = nm.erral; 00088 dlal = nm.dlal; 00089 dlminal = nm.dlminal; 00090 dlmaxal = nm.dlmaxal; 00091 psial = nm.psial; 00092 00093 nsnal = nm.nsnal; 00094 nsdofal = nm.nsdofal; 00095 probdimal = nm.probdimal; 00096 00097 nxal = nm.nxal; 00098 nyal = nm.nyal; 00099 nzal = nm.nzal; 00100 00101 00102 switch (displnorm){ 00103 case alldofs:{ break; } 00104 case seldofs:{ 00105 selnodal = new long [nsdofal]; 00106 seldofal = new long [nsdofal]; 00107 00108 for (i=0;i<nsdofal;i++){ 00109 selnodal[i]=nm.selnodal[i]; 00110 seldofal[i]=nm.seldofal[i]; 00111 } 00112 00113 break; 00114 } 00115 case seldofscoord:{ 00116 seldofal = new long [nsdofal]; 00117 selnodcoord = new double [3*nsdofal]; 00118 00119 for (i=0;i<nsdofal;i++){ 00120 selnodcoord[3*i]=nm.selnodcoord[3*i]; 00121 selnodcoord[3*i+1]=nm.selnodcoord[3*i+1]; 00122 selnodcoord[3*i+2]=nm.selnodcoord[3*i+2]; 00123 seldofal[i]=nm.seldofal[i]; 00124 } 00125 00126 break; 00127 } 00128 case selecnodes:{ 00129 selnodal = new long [nsnal]; 00130 00131 for (i=0;i<nsnal;i++){ 00132 selnodal[i]=nm.selnodal[i]; 00133 } 00134 00135 break; 00136 } 00137 case nodesdistincr:{ 00138 nsnal=2; 00139 selnodal = new long [nsnal]; 00140 00141 for (i=0;i<nsnal;i++){ 00142 selnodal[i]=nm.selnodal[i]; 00143 } 00144 00145 break; 00146 } 00147 default:{ 00148 fprintf (stderr,"\n\n unknown norm measurement of displacement increment (file %s, line %d).\n",__FILE__,__LINE__); 00149 } 00150 } 00151 00152 00153 // NEWTON-RAPHSON METHOD 00154 ninr = nm.ninr; 00155 niilnr = nm.niilnr; 00156 errnr = nm.errnr; 00157 incrnr = nm.incrnr; 00158 minincrnr = nm.minincrnr; 00159 rvlam = nm.rvlam; 00160 nienr = nm.nienr; 00161 hdbr = nm.hdbr; 00162 if (hdbr) 00163 { 00164 hdbid = nm.hdbid; 00165 for (i=0; i < long(strlen(nm.backupfname)); i++) 00166 backupfname[i] = nm.backupfname[i]; 00167 } 00168 } 00169 */