Changeset 15711
- Timestamp:
- 08/05/13 15:05:16 (12 years ago)
- Location:
- issm/trunk-jpl/src/c/classes/Elements
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r15707 r15711 6981 6981 ElementMatrix* Penta::CreateKMatrixDiagnosticSIA(void){ 6982 6982 6983 /*Constants*/6984 const int numdof=NDOF2*NUMVERTICES;6985 6986 6983 /*Intermediaries*/ 6987 int connectivity[2]; 6988 int i,i0,i1,j0,j1; 6989 IssmDouble one0,one1; 6984 IssmDouble connectivity[2]; 6985 IssmDouble one0,one1; 6986 int i,i0,i1,j0,j1; 6987 6988 /*Fetch number of nodes and dof for this finite element*/ 6989 int numnodes = this->NumberofNodes(); _assert_(numnodes==6); 6990 int numdof = numnodes*NDOF2; 6990 6991 6991 6992 /*Initialize Element matrix*/ 6992 ElementMatrix* Ke=new ElementMatrix(nodes, NUMVERTICES,this->parameters,NoneApproximationEnum);6993 6994 /* Spawn 3 beam elements:*/6993 ElementMatrix* Ke=new ElementMatrix(nodes,numnodes,this->parameters,NoneApproximationEnum); 6994 6995 /*3 vertical edges*/ 6995 6996 for(i=0;i<3;i++){ 6997 6996 6998 /*2 dofs of first node*/ 6997 i0=2*i; 6998 i1=2*i+1; 6999 i0=2*i; i1=2*i+1; 6999 7000 /*2 dofs of second node*/ 7000 j0=2*(i+3); 7001 j1=2*(i+3)+1; 7001 j0=2*(i+3); j1=2*(i+3)+1; 7002 7002 7003 7003 /*Find connectivity for the two nodes*/ 7004 connectivity[0]= vertices[i]->Connectivity();7005 connectivity[1]= vertices[i+3]->Connectivity();7006 one0=1 /(IssmDouble)connectivity[0];7007 one1=1 /(IssmDouble)connectivity[1];7004 connectivity[0]=(IssmDouble)vertices[i]->Connectivity(); 7005 connectivity[1]=(IssmDouble)vertices[i+3]->Connectivity(); 7006 one0=1./connectivity[0]; 7007 one1=1./connectivity[1]; 7008 7008 7009 7009 /*Create matrix for these two nodes*/ 7010 7010 if (IsOnBed() && IsOnSurface()){ 7011 Ke->values[i0*numdof+i0] =one0;7012 Ke->values[i1*numdof+i1] =one0;7013 Ke->values[j0*numdof+i0] =-one1;7014 Ke->values[j0*numdof+j0] =one1;7015 Ke->values[j1*numdof+i1] =-one1;7016 Ke->values[j1*numdof+j1] =one1;7011 Ke->values[i0*numdof+i0] = +one0; 7012 Ke->values[i1*numdof+i1] = +one0; 7013 Ke->values[j0*numdof+i0] = -one1; 7014 Ke->values[j0*numdof+j0] = +one1; 7015 Ke->values[j1*numdof+i1] = -one1; 7016 Ke->values[j1*numdof+j1] = +one1; 7017 7017 } 7018 7018 else if (IsOnBed()){ 7019 Ke->values[i0*numdof+i0] =one0;7020 Ke->values[i1*numdof+i1] =one0;7021 Ke->values[j0*numdof+i0] =-2*one1;7022 Ke->values[j0*numdof+j0] =2*one1;7023 Ke->values[j1*numdof+i1] =-2*one1;7024 Ke->values[j1*numdof+j1] =2*one1;7019 Ke->values[i0*numdof+i0] = one0; 7020 Ke->values[i1*numdof+i1] = one0; 7021 Ke->values[j0*numdof+i0] = -2.*one1; 7022 Ke->values[j0*numdof+j0] = +2.*one1; 7023 Ke->values[j1*numdof+i1] = -2.*one1; 7024 Ke->values[j1*numdof+j1] = +2.*one1; 7025 7025 } 7026 7026 else if (IsOnSurface()){ 7027 Ke->values[j0*numdof+i0] =-one1;7028 Ke->values[j0*numdof+j0] =one1;7029 Ke->values[j1*numdof+i1] =-one1;7030 Ke->values[j1*numdof+j1] =one1;7027 Ke->values[j0*numdof+i0] = -one1; 7028 Ke->values[j0*numdof+j0] = +one1; 7029 Ke->values[j1*numdof+i1] = -one1; 7030 Ke->values[j1*numdof+j1] = +one1; 7031 7031 } 7032 7032 else{ //node is on two horizontal layers and beams include the values only once, so the have to use half of the connectivity 7033 Ke->values[j0*numdof+i0] =-2*one1;7034 Ke->values[j0*numdof+j0] =2*one1;7035 Ke->values[j1*numdof+i1] =-2*one1;7036 Ke->values[j1*numdof+j1] =2*one1;7033 Ke->values[j0*numdof+i0] = -2.*one1; 7034 Ke->values[j0*numdof+j0] = +2.*one1; 7035 Ke->values[j1*numdof+i1] = -2.*one1; 7036 Ke->values[j1*numdof+j1] = +2.*one1; 7037 7037 } 7038 7038 } … … 8264 8264 8265 8265 /*Intermediaries*/ 8266 int i,j; 8267 int node0,node1; 8268 int connectivity[2]; 8269 IssmDouble Jdet; 8270 IssmDouble xyz_list[NUMVERTICES][3]; 8271 IssmDouble xyz_list_segment[2][3]; 8272 IssmDouble z_list[NUMVERTICES]; 8273 IssmDouble slope[2]; 8274 IssmDouble slope2,constant_part; 8275 IssmDouble rho_ice,gravity,n,B; 8276 IssmDouble ub,vb,z_g,surface,thickness; 8277 GaussPenta* gauss=NULL; 8266 int i,j; 8267 int node0,node1; 8268 IssmDouble connectivity[2]; 8269 IssmDouble Jdet; 8270 IssmDouble xyz_list[NUMVERTICES][3]; 8271 IssmDouble xyz_list_segment[2][3]; 8272 IssmDouble z_list[NUMVERTICES]; 8273 IssmDouble slope[2]; 8274 IssmDouble slope2,constant_part; 8275 IssmDouble rho_ice,gravity,n,B; 8276 IssmDouble ub,vb,z_g,surface,thickness; 8277 GaussPenta* gauss=NULL; 8278 8279 /*Fetch number of nodes and dof for this finite element*/ 8280 int numnodes = this->NumberofNodes(); _assert_(numnodes==6); 8281 int numdof = numnodes*NDOF2; 8278 8282 8279 8283 /*Initialize Element vector*/ 8280 ElementVector* pe=new ElementVector(nodes, NUMVERTICES,this->parameters);8284 ElementVector* pe=new ElementVector(nodes,numnodes,this->parameters); 8281 8285 8282 8286 /*Retrieve all inputs and parameters*/ … … 8294 8298 /*Loop on the three segments*/ 8295 8299 for(i=0;i<3;i++){ 8296 node0=i; 8297 node 1=i+3;8300 8301 node0=i; node1=i+3; 8298 8302 8299 8303 for(j=0;j<3;j++){ … … 8302 8306 } 8303 8307 8304 connectivity[0]= vertices[node0]->Connectivity();8305 connectivity[1]= vertices[node1]->Connectivity();8308 connectivity[0]=(IssmDouble)vertices[node0]->Connectivity(); 8309 connectivity[1]=(IssmDouble)vertices[node1]->Connectivity(); 8306 8310 8307 8311 /*Loop on the Gauss points: */ … … 8316 8320 8317 8321 slope2=pow(slope[0],2)+pow(slope[1],2); 8318 constant_part=-2 *pow(rho_ice*gravity,n)*pow(slope2,((n-1)/2));8322 constant_part=-2.*pow(rho_ice*gravity,n)*pow(slope2,((n-1.)/2.)); 8319 8323 8320 8324 PentaRef::GetInputValue(&z_g,&z_list[0],gauss); 8321 8325 GetSegmentJacobianDeterminant(&Jdet,&xyz_list_segment[0][0],gauss); 8322 8326 8323 if (IsOnSurface()){ 8324 for(j=0;j<NDOF2;j++) pe->values[2*node1+j]+=constant_part*pow((surface-z_g)/B,n)*slope[j]*Jdet*gauss->weight/(IssmDouble)connectivity[1]; 8327 if(IsOnSurface()){ 8328 pe->values[2*node1+0]+=constant_part*pow((surface-z_g)/B,n)*slope[0]*Jdet*gauss->weight/connectivity[1]; 8329 pe->values[2*node1+1]+=constant_part*pow((surface-z_g)/B,n)*slope[1]*Jdet*gauss->weight/connectivity[1]; 8325 8330 } 8326 else{//connectivity is too large, should take only half on it 8327 for(j=0;j<NDOF2;j++) pe->values[2*node1+j]+=constant_part*pow((surface-z_g)/B,n)*slope[j]*Jdet*gauss->weight*2/(IssmDouble)connectivity[1]; 8331 else{/*connectivity is too large, should take only half on it*/ 8332 pe->values[2*node1+0]+=constant_part*pow((surface-z_g)/B,n)*slope[0]*Jdet*gauss->weight*2./connectivity[1]; 8333 pe->values[2*node1+1]+=constant_part*pow((surface-z_g)/B,n)*slope[1]*Jdet*gauss->weight*2./connectivity[1]; 8328 8334 } 8329 8335 } 8330 8336 delete gauss; 8331 8337 8332 / /Deal with lower surface8333 if 8334 constant_part=-1.58*pow( (IssmDouble)10.0,-(IssmDouble)10.0)*rho_ice*gravity*thickness;8338 /*Deal with lower surface*/ 8339 if(IsOnBed()){ 8340 constant_part=-1.58*pow(10.,-10.)*rho_ice*gravity*thickness; 8335 8341 ub=constant_part*slope[0]; 8336 8342 vb=constant_part*slope[1]; 8337 8343 8338 pe->values[2*node0 ]+=ub/(IssmDouble)connectivity[0];8339 pe->values[2*node0+1]+=vb/ (IssmDouble)connectivity[0];8344 pe->values[2*node0+0]+=ub/connectivity[0]; 8345 pe->values[2*node0+1]+=vb/connectivity[0]; 8340 8346 } 8341 8347 } -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r15704 r15711 3106 3106 3107 3107 /*Intermediaries*/ 3108 const int numdof=NUMVERTICES*NDOF2; 3109 int i,connectivity; 3108 IssmDouble connectivity; 3109 3110 /*Fetch number of nodes and dof for this finite element*/ 3111 int numnodes = this->NumberofNodes(); _assert_(numnodes==3); 3112 int numdof = numnodes*NDOF2; 3110 3113 3111 3114 /*Initialize Element matrix*/ 3112 ElementMatrix* Ke=new ElementMatrix(nodes, NUMVERTICES,this->parameters,NoneApproximationEnum);3115 ElementMatrix* Ke=new ElementMatrix(nodes,numnodes,this->parameters,NoneApproximationEnum); 3113 3116 3114 3117 /*Create Element matrix*/ 3115 for(i =0;i<NUMVERTICES;i++){3116 connectivity= vertices[i]->Connectivity();3117 Ke->values[(2*i )*numdof +(2*i) ]=1/(IssmDouble)connectivity;3118 Ke->values[(2*i+1)*numdof+(2*i+1)]=1 /(IssmDouble)connectivity;3118 for(int i=0;i<numnodes;i++){ 3119 connectivity=(IssmDouble)vertices[i]->Connectivity(); 3120 Ke->values[(2*i+0)*numdof+(2*i+0)]=1./connectivity; 3121 Ke->values[(2*i+1)*numdof+(2*i+1)]=1./connectivity; 3119 3122 } 3120 3123 … … 3276 3279 3277 3280 /*Intermediaries */ 3278 int i,connectivity; 3279 IssmDouble constant_part,ub,vb; 3280 IssmDouble rho_ice,gravity,n,B; 3281 IssmDouble slope2,thickness; 3282 IssmDouble slope[2]; 3283 GaussTria* gauss=NULL; 3281 IssmDouble constant_part,ub,vb; 3282 IssmDouble rho_ice,gravity,n,B; 3283 IssmDouble slope2,thickness,connectivity; 3284 IssmDouble slope[2]; 3285 3286 /*Fetch number of nodes and dof for this finite element*/ 3287 int numnodes = this->NumberofNodes(); _assert_(numnodes==3); 3288 int numdof = numnodes*NDOF2; 3284 3289 3285 3290 /*Initialize Element vector*/ 3286 ElementVector* pe=new ElementVector(nodes, NUMVERTICES,this->parameters);3291 ElementVector* pe=new ElementVector(nodes,numnodes,this->parameters); 3287 3292 3288 3293 /*Retrieve all inputs and parameters*/ … … 3296 3301 3297 3302 /*Spawn 3 sing elements: */ 3298 gauss=new GaussTria();3299 for(i =0;i<NUMVERTICES;i++){3303 GaussTria* gauss=new GaussTria(); 3304 for(int i=0;i<numnodes;i++){ 3300 3305 3301 3306 gauss->GaussVertex(i); 3302 3307 3303 connectivity= vertices[i]->Connectivity();3308 connectivity=(IssmDouble)vertices[i]->Connectivity(); 3304 3309 3305 3310 thickness_input->GetInputValue(&thickness,gauss); … … 3308 3313 slope2=pow(slope[0],2)+pow(slope[1],2); 3309 3314 3310 constant_part=-2 *pow(rho_ice*gravity,n)*pow(slope2,((n-1)/2));3311 3312 ub=-1.58*pow( (IssmDouble)10.0,(IssmDouble)-10.0)*rho_ice*gravity*thickness*slope[0];3313 vb=-1.58*pow( (IssmDouble)10.0,(IssmDouble)-10.0)*rho_ice*gravity*thickness*slope[1];3314 3315 pe->values[2*i ] =(ub-2.0*pow(rho_ice*gravity,n)*pow(slope2,((n-1)/2.0))*pow(thickness,n)/(pow(B,n)*(n+1))*slope[0])/(IssmDouble)connectivity;3316 pe->values[2*i+1]=(vb-2. 0*pow(rho_ice*gravity,n)*pow(slope2,((n-1)/2.0))*pow(thickness,n)/(pow(B,n)*(n+1))*slope[1])/(IssmDouble)connectivity;3315 constant_part=-2.*pow(rho_ice*gravity,n)*pow(slope2,((n-1.)/2.)); 3316 3317 ub=-1.58*pow(10.,-10.)*rho_ice*gravity*thickness*slope[0]; 3318 vb=-1.58*pow(10.,-10.)*rho_ice*gravity*thickness*slope[1]; 3319 3320 pe->values[2*i+0]=(ub-2.*pow(rho_ice*gravity,n)*pow(slope2,((n-1.)/2.))*pow(thickness,n)/(pow(B,n)*(n+1))*slope[0])/connectivity; 3321 pe->values[2*i+1]=(vb-2.*pow(rho_ice*gravity,n)*pow(slope2,((n-1.)/2.))*pow(thickness,n)/(pow(B,n)*(n+1))*slope[1])/connectivity; 3317 3322 } 3318 3323
Note:
See TracChangeset
for help on using the changeset viewer.