00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <RadauBeamIntegration.h>
00026 #include <math.h>
00027
00028 RadauBeamIntegration::RadauBeamIntegration():
00029 BeamIntegration(BEAM_INTEGRATION_TAG_Radau)
00030 {
00031
00032 }
00033
00034 RadauBeamIntegration::~RadauBeamIntegration()
00035 {
00036
00037 }
00038
00039 BeamIntegration*
00040 RadauBeamIntegration::getCopy(void)
00041 {
00042 return new RadauBeamIntegration();
00043 }
00044
00045 #ifdef _WIN32
00046
00047 extern "C" int GAUSSQ(int *kind, int *n, double *alpha, double *beta,
00048 int *kpts, double *endpts, double *b,
00049 double *t, double *w);
00050
00051 #define gaussq_ GAUSSQ
00052
00053 #else
00054
00055 extern "C" int gaussq_(int *kind, int *n, double *alpha, double *beta,
00056 int *kpts, double *endpts, double *b,
00057 double *t, double *w);
00058
00059 #endif
00060
00061 void
00062 RadauBeamIntegration::getSectionLocations(int numSections, double L,
00063 double *xi)
00064 {
00065 switch(numSections) {
00066
00067 case 1:
00068 xi[0] = -1.0;
00069 break;
00070
00071 case 2:
00072 xi[0] = -1.0;
00073 xi[1] = 0.3333333333;
00074 break;
00075
00076 case 3:
00077 xi[0] = -1.0;
00078 xi[1] = -0.2898979485;
00079 xi[2] = 0.6898979485;
00080 break;
00081
00082 case 4:
00083 xi[0] = -1.0;
00084 xi[1] = -0.5753189235;
00085 xi[2] = 0.1810662711;
00086 xi[3] = 0.8228240809;
00087 break;
00088
00089 case 5:
00090 xi[0] = -1.0;
00091 xi[1] = -0.7204802713;
00092 xi[2] = -0.1671808647;
00093 xi[3] = 0.4463139727;
00094 xi[4] = 0.8857916077;
00095 break;
00096
00097 case 6:
00098 xi[0] = -1.0;
00099 xi[1] = -0.8029298284;
00100 xi[2] = -0.3909285467;
00101 xi[3] = 0.1240503795;
00102 xi[4] = 0.6039731642;
00103 xi[5] = 0.9203802858;
00104 break;
00105
00106 case 7:
00107 xi[0] = -1.0;
00108 xi[1] = -0.8538913426;
00109 xi[2] = -0.5384677240;
00110 xi[3] = -0.1173430375;
00111 xi[4] = 0.3260306194;
00112 xi[5] = 0.7038428006;
00113 xi[6] = 0.9413671456;
00114 break;
00115
00116 case 8:
00117 xi[0] = -1.0;
00118 xi[1] = -0.8874748789;
00119 xi[2] = -0.6395186165;
00120 xi[3] = -0.2947505657;
00121 xi[4] = 0.09430725266;
00122 xi[5] = 0.4684203544;
00123 xi[6] = 0.7706418936;
00124 xi[7] = 0.9550412271;
00125 break;
00126
00127 case 9:
00128 xi[0] = -1.0;
00129 xi[1] = -0.9107320894;
00130 xi[2] = -0.7112674859;
00131 xi[3] = -0.4263504857;
00132 xi[4] = -0.09037336960;
00133 xi[5] = 0.2561356708;
00134 xi[6] = 0.5713830412;
00135 xi[7] = 0.8173527842;
00136 xi[8] = 0.9644401697;
00137 break;
00138
00139 case 10:
00140 xi[0] = -1.0;
00141 xi[1] = -0.9274843742;
00142 xi[2] = -0.7638420424;
00143 xi[3] = -0.5256460303;
00144 xi[4] = -0.2362344693;
00145 xi[5] = 0.07605919783;
00146 xi[6] = 0.3806648401;
00147 xi[7] = 0.6477666876;
00148 xi[8] = 0.8512252205;
00149 xi[9] = 0.9711751807;
00150 break;
00151
00152 default:
00153 break;
00154 }
00155
00156 for (int i = 0; i < numSections; i++)
00157 xi[i] = 0.5*(xi[i] + 1.0);
00158 }
00159
00160 void
00161 RadauBeamIntegration::getSectionWeights(int numSections, double L,
00162 double *wt)
00163 {
00164 switch (numSections) {
00165
00166 case 1:
00167 wt[0] = 2.0;
00168 break;
00169
00170 case 2:
00171 wt[0] = 0.5;
00172 wt[1] = 1.5;
00173 break;
00174
00175 case 3:
00176 wt[0] = 0.2222222222;
00177 wt[1] = 1.024971652;
00178 wt[2] = 0.7528061254;
00179 break;
00180
00181 case 4:
00182 wt[0] = 0.125;
00183 wt[1] = 0.6576886399;
00184 wt[2] = 0.7763869376;
00185 wt[3] = 0.4409244223;
00186 break;
00187
00188 case 5:
00189 wt[0] = 0.08;
00190 wt[1] = 0.4462078021;
00191 wt[2] = 0.6236530459;
00192 wt[3] = 0.5627120302;
00193 wt[4] = 0.2874271215;
00194 break;
00195
00196 case 6:
00197 wt[0] = 0.05555555555;
00198 wt[1] = 0.3196407532;
00199 wt[2] = 0.4853871884;
00200 wt[3] = 0.5209267831;
00201 wt[4] = 0.4169013343;
00202 wt[5] = 0.2015883852;
00203 break;
00204
00205 case 7:
00206 wt[0] = 0.04081632653;
00207 wt[1] = 0.2392274892;
00208 wt[2] = 0.3809498736;
00209 wt[3] = 0.4471098290;
00210 wt[4] = 0.4247037790;
00211 wt[5] = 0.3182042314;
00212 wt[6] = 0.1489884711;
00213 break;
00214
00215 case 8:
00216 wt[0] = 0.03125;
00217 wt[1] = 0.1853581548;
00218 wt[2] = 0.3041306206;
00219 wt[3] = 0.3765175453;
00220 wt[4] = 0.3915721674;
00221 wt[5] = 0.3470147956;
00222 wt[6] = 0.2496479013;
00223 wt[7] = 0.1145088147;
00224 break;
00225
00226 case 9:
00227 wt[0] = 0.02469135802;
00228 wt[1] = 0.1476540190;
00229 wt[2] = 0.2471893782;
00230 wt[3] = 0.3168437756;
00231 wt[4] = 0.3482730027;
00232 wt[5] = 0.3376939669;
00233 wt[6] = 0.2863866963;
00234 wt[7] = 0.2005532980;
00235 wt[8] = 0.09071450492;
00236 break;
00237
00238 case 10:
00239 wt[0] = 0.02;
00240 wt[1] = 0.1202966705;
00241 wt[2] = 0.2042701318;
00242 wt[3] = 0.2681948378;
00243 wt[4] = 0.3058592877;
00244 wt[5] = 0.3135824572;
00245 wt[6] = 0.2906101648;
00246 wt[7] = 0.2391934317;
00247 wt[8] = 0.1643760127;
00248 wt[9] = 0.07361700548;
00249 break;
00250
00251 default:
00252 break;
00253 }
00254
00255 for (int i = 0; i < numSections; i++)
00256 wt[i] *= 0.5;
00257 }
00258
00259 void
00260 RadauBeamIntegration::Print(OPS_Stream &s, int flag)
00261 {
00262 s << "Radau" << endln;
00263 }