Changeset 10523
- Timestamp:
- 11/08/11 10:07:23 (13 years ago)
- Location:
- issm/trunk/src/c
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
r10521 r10523 445 445 NearestInterpEnum, 446 446 /*}}}*/ 447 /*Coordinate Systems{{{1*/ 448 XYEnum, 449 XYZPEnum, 450 /*}}}*/ 447 451 /*Options{{{1*/ 448 452 OptionEnum, -
issm/trunk/src/c/objects/Elements/Penta.cpp
r10517 r10523 5745 5745 5746 5746 /*Transform Coordinate System*/ 5747 TransformStiffnessMatrixCoord(Ke,tria->nodes,NUMVERTICES2D, NDOF2);5747 TransformStiffnessMatrixCoord(Ke,tria->nodes,NUMVERTICES2D,XYEnum); 5748 5748 5749 5749 /*Clean up and return*/ … … 5877 5877 5878 5878 /*Transform Coordinate System*/ 5879 TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES, NDOF2);5879 TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYEnum); 5880 5880 5881 5881 /*Clean up and return*/ … … 5951 5951 5952 5952 /*Transform Coordinate System*/ 5953 TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES, NDOF2);5953 TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYEnum); 5954 5954 5955 5955 /*Clean up and return*/ … … 6043 6043 6044 6044 /*Transform Coordinate System*/ 6045 TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES, NDOF4);6045 TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYZPEnum); 6046 6046 6047 6047 /*Clean up and return*/ … … 6114 6114 6115 6115 /*DO NOT Transform Coordinate System: this stiffness matrix is already expressed in tangential coordinates*/ 6116 //TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES, NDOF4);6116 //TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYZPEnum); 6117 6117 6118 6118 /*Clean up and return*/ … … 6735 6735 6736 6736 /*Transform coordinate system*/ 6737 TransformLoadVectorCoord(pe,nodes,NUMVERTICES, NDOF2);6737 TransformLoadVectorCoord(pe,nodes,NUMVERTICES,XYEnum); 6738 6738 6739 6739 /*Clean up and return*/ … … 6829 6829 6830 6830 /*Transform coordinate system*/ 6831 TransformLoadVectorCoord(pe,nodes,NUMVERTICES, NDOF4);6831 TransformLoadVectorCoord(pe,nodes,NUMVERTICES,XYZPEnum); 6832 6832 6833 6833 /*Clean up and return*/ … … 6897 6897 6898 6898 /*Transform coordinate system*/ 6899 TransformLoadVectorCoord(pe,nodes,NUMVERTICES, NDOF4);6899 TransformLoadVectorCoord(pe,nodes,NUMVERTICES,XYZPEnum); 6900 6900 6901 6901 /*Clean up and return*/ … … 7256 7256 7257 7257 /*Transform solution in Cartesian Space*/ 7258 TransformSolutionCoord(&values[0],nodes,NUMVERTICES2D, NDOF2); /*2D: only the first 3 nodes are taken*/7258 TransformSolutionCoord(&values[0],nodes,NUMVERTICES2D,XYEnum); /*2D: only the first 3 nodes are taken*/ 7259 7259 7260 7260 /*Ok, we have vx and vy in values, fill in vx and vy arrays and extrude */ … … 7515 7515 7516 7516 /*Transform solution in Cartesian Space*/ 7517 TransformSolutionCoord(&values[0],nodes,NUMVERTICES, NDOF2);7517 TransformSolutionCoord(&values[0],nodes,NUMVERTICES,XYEnum); 7518 7518 7519 7519 /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ … … 7841 7841 7842 7842 /*Transform solution in Cartesian Space*/ 7843 TransformSolutionCoord(&values[0],nodes,NUMVERTICES, NDOF4);7843 TransformSolutionCoord(&values[0],nodes,NUMVERTICES,XYZPEnum); 7844 7844 7845 7845 /*Ok, we have vx and vy in values, fill in all arrays: */ -
issm/trunk/src/c/objects/Elements/Tria.cpp
r10449 r10523 2707 2707 2708 2708 /*Transform Coordinate System*/ 2709 TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES, NDOF2);2709 TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYEnum); 2710 2710 2711 2711 /*Clean up and return*/ … … 2775 2775 2776 2776 /*Transform Coordinate System*/ 2777 TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES, NDOF2);2777 TransformStiffnessMatrixCoord(Ke,nodes,NUMVERTICES,XYEnum); 2778 2778 2779 2779 /*Clean up and return*/ … … 2851 2851 2852 2852 /*Transform coordinate system*/ 2853 TransformLoadVectorCoord(pe,nodes,NUMVERTICES, NDOF2);2853 TransformLoadVectorCoord(pe,nodes,NUMVERTICES,XYEnum); 2854 2854 2855 2855 /*Clean up and return*/ … … 3009 3009 3010 3010 /*Transform solution in Cartesian Space*/ 3011 TransformSolutionCoord(&values[0],nodes,NUMVERTICES, NDOF2);3011 TransformSolutionCoord(&values[0],nodes,NUMVERTICES,XYEnum); 3012 3012 3013 3013 /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ -
issm/trunk/src/c/objects/Loads/Icefront.cpp
r10407 r10523 530 530 531 531 /*Transform load vector*/ 532 TransformLoadVectorCoord(pe,nodes,NUMVERTICESSEG, NDOF2);532 TransformLoadVectorCoord(pe,nodes,NUMVERTICESSEG,XYEnum); 533 533 534 534 /*Clean up and return*/ … … 647 647 648 648 /*Transform load vector*/ 649 TransformLoadVectorCoord(pe,nodes,NUMVERTICESQUA, NDOF2);649 TransformLoadVectorCoord(pe,nodes,NUMVERTICESQUA,XYEnum); 650 650 651 651 /*Clean up and return*/ … … 725 725 726 726 /*Transform load vector*/ 727 TransformLoadVectorCoord(pe,nodes,NUMVERTICESQUA, NDOF4);727 TransformLoadVectorCoord(pe,nodes,NUMVERTICESQUA,XYZPEnum); 728 728 729 729 /*Clean up and return*/ -
issm/trunk/src/c/objects/Loads/Pengrid.cpp
r10407 r10523 560 560 561 561 /*Transform Coordinate System*/ 562 TransformStiffnessMatrixCoord(Ke,&node,NUMVERTICES, NDOF4);562 TransformStiffnessMatrixCoord(Ke,&node,NUMVERTICES,XYZPEnum); 563 563 564 564 /*Clean up and return*/ -
issm/trunk/src/c/shared/Elements/CoordinateSystemTransform.cpp
r10407 r10523 5 5 #include <math.h> 6 6 7 void CoordinateSystemTransform(double** ptransform,Node** nodes,int numnodes,int dofspernode){7 void CoordinateSystemTransform(double** ptransform,Node** nodes,int numnodes,int* cs_array){ 8 8 9 int i; 9 int i,counter; 10 int numdofs = 0; 10 11 double x_norm,y_norm; 11 12 double *transform = NULL; … … 13 14 double coord_system[3][3]; 14 15 15 /*Some checks */16 /*Some checks in debugging mode*/ 16 17 _assert_(numnodes && nodes); 17 if(dofspernode!=2 && dofspernode!=3 && dofspernode!=4) _error_("list of dofs per node supported: 2, 3 and 4"); 18 19 /*Get total number of dofs*/ 20 for(i=0;i<numnodes;i++){ 21 switch(cs_array[i]){ 22 case XYEnum: numdofs+=2; break; 23 case XYZPEnum: numdofs+=4; break; 24 default: _error_("Coordinate system %s not supported yet",EnumToStringx(cs_array[i])); 25 } 26 } 18 27 19 28 /*Allocate and initialize transform matrix*/ 20 transform=(double*)xmalloc(num nodes*dofspernode*numnodes*dofspernode*sizeof(double));21 for(i=0;i<num nodes*dofspernode*numnodes*dofspernode;i++) transform[i]=0.0;29 transform=(double*)xmalloc(numdofs*numdofs*sizeof(double)); 30 for(i=0;i<numdofs*numdofs;i++) transform[i]=0.0; 22 31 23 32 /*Create transform matrix for all nodes (x,y for 2d and x,y,z for 3d). It is a block matrix … … 30 39 * Where T1 is the transform matrix for node 1. It is a simple copy of the coordinate system 31 40 * associated to this node*/ 41 counter=0; 32 42 for(i=0;i<numnodes;i++){ 33 43 nodes[i]->GetCoordinateSystem(&coord_system[0][0]); 34 if(dofspernode==2){ 35 /*We remove the z component, we need to renormalize x and y*/ 36 x_norm = sqrt( coord_system[0][0]*coord_system[0][0] + coord_system[1][0]*coord_system[1][0]); 37 y_norm = sqrt( coord_system[0][1]*coord_system[0][1] + coord_system[1][1]*coord_system[1][1]); 38 transform[(dofspernode*numnodes)*(i*dofspernode+0) + i*dofspernode+0] = coord_system[0][0]/x_norm; 39 transform[(dofspernode*numnodes)*(i*dofspernode+0) + i*dofspernode+1] = coord_system[0][1]/y_norm; 40 transform[(dofspernode*numnodes)*(i*dofspernode+1) + i*dofspernode+0] = coord_system[1][0]/x_norm; 41 transform[(dofspernode*numnodes)*(i*dofspernode+1) + i*dofspernode+1] = coord_system[1][1]/y_norm; 42 } 43 else if(dofspernode==3){ 44 transform[(dofspernode*numnodes)*(i*dofspernode+0) + i*dofspernode+0] = coord_system[0][0]; 45 transform[(dofspernode*numnodes)*(i*dofspernode+0) + i*dofspernode+1] = coord_system[0][1]; 46 transform[(dofspernode*numnodes)*(i*dofspernode+0) + i*dofspernode+2] = coord_system[0][2]; 47 transform[(dofspernode*numnodes)*(i*dofspernode+1) + i*dofspernode+0] = coord_system[1][0]; 48 transform[(dofspernode*numnodes)*(i*dofspernode+1) + i*dofspernode+1] = coord_system[1][1]; 49 transform[(dofspernode*numnodes)*(i*dofspernode+1) + i*dofspernode+2] = coord_system[1][2]; 50 transform[(dofspernode*numnodes)*(i*dofspernode+2) + i*dofspernode+0] = coord_system[2][0]; 51 transform[(dofspernode*numnodes)*(i*dofspernode+2) + i*dofspernode+1] = coord_system[2][1]; 52 transform[(dofspernode*numnodes)*(i*dofspernode+2) + i*dofspernode+2] = coord_system[2][2]; 53 } 54 else if(dofspernode==4){ 55 /*Only the first 3 coordinates are changed (x,y,z), leave the others (P) unchanged*/ 56 transform[(dofspernode*numnodes)*(i*dofspernode+0) + i*dofspernode+0] = coord_system[0][0]; 57 transform[(dofspernode*numnodes)*(i*dofspernode+0) + i*dofspernode+1] = coord_system[0][1]; 58 transform[(dofspernode*numnodes)*(i*dofspernode+0) + i*dofspernode+2] = coord_system[0][2]; 59 transform[(dofspernode*numnodes)*(i*dofspernode+1) + i*dofspernode+0] = coord_system[1][0]; 60 transform[(dofspernode*numnodes)*(i*dofspernode+1) + i*dofspernode+1] = coord_system[1][1]; 61 transform[(dofspernode*numnodes)*(i*dofspernode+1) + i*dofspernode+2] = coord_system[1][2]; 62 transform[(dofspernode*numnodes)*(i*dofspernode+2) + i*dofspernode+0] = coord_system[2][0]; 63 transform[(dofspernode*numnodes)*(i*dofspernode+2) + i*dofspernode+1] = coord_system[2][1]; 64 transform[(dofspernode*numnodes)*(i*dofspernode+2) + i*dofspernode+2] = coord_system[2][2]; 65 transform[(dofspernode*numnodes)*(i*dofspernode+3) + i*dofspernode+3] = 1.0; 44 switch(cs_array[i]){ 45 case XYEnum: 46 /*We remove the z component, we need to renormalize x and y*/ 47 x_norm = sqrt( coord_system[0][0]*coord_system[0][0] + coord_system[1][0]*coord_system[1][0]); 48 y_norm = sqrt( coord_system[0][1]*coord_system[0][1] + coord_system[1][1]*coord_system[1][1]); 49 transform[(numdofs)*(counter+0) + counter+0] = coord_system[0][0]/x_norm; 50 transform[(numdofs)*(counter+0) + counter+1] = coord_system[0][1]/y_norm; 51 transform[(numdofs)*(counter+1) + counter+0] = coord_system[1][0]/x_norm; 52 transform[(numdofs)*(counter+1) + counter+1] = coord_system[1][1]/y_norm; 53 counter+=2; 54 break; 55 case XYZPEnum: 56 /*Only the first 3 coordinates are changed (x,y,z), leave the others (P) unchanged*/ 57 transform[(numdofs)*(counter+0) + counter+0] = coord_system[0][0]; 58 transform[(numdofs)*(counter+0) + counter+1] = coord_system[0][1]; 59 transform[(numdofs)*(counter+0) + counter+2] = coord_system[0][2]; 60 transform[(numdofs)*(counter+1) + counter+0] = coord_system[1][0]; 61 transform[(numdofs)*(counter+1) + counter+1] = coord_system[1][1]; 62 transform[(numdofs)*(counter+1) + counter+2] = coord_system[1][2]; 63 transform[(numdofs)*(counter+2) + counter+0] = coord_system[2][0]; 64 transform[(numdofs)*(counter+2) + counter+1] = coord_system[2][1]; 65 transform[(numdofs)*(counter+2) + counter+2] = coord_system[2][2]; 66 transform[(numdofs)*(counter+3) + counter+3] = 1.0; 67 counter+=4; 68 break; 69 default: 70 _error_("Coordinate system %s not supported yet",EnumToStringx(cs_array[i])); 66 71 } 67 72 } -
issm/trunk/src/c/shared/Elements/TransformLoadVectorCoord.cpp
r10407 r10523 4 4 #include "./elements.h" 5 5 6 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int dofspernode){ 6 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum){ 7 int* cs_array=NULL; 8 9 /*All nodes have the same Coordinate System*/ 10 cs_array=(int*)xmalloc(numnodes*sizeof(int)); 11 for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum; 12 13 /*Call core*/ 14 TransformLoadVectorCoord(pe,nodes,numnodes,cs_array); 15 16 /*Clean-up*/ 17 xfree((void**)&cs_array); 18 } 19 20 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array){ 7 21 8 22 int i,j; 23 int numdofs = 0; 9 24 double *transform = NULL; 10 25 double *values = NULL; 26 27 /*Get total number of dofs*/ 28 for(i=0;i<numnodes;i++){ 29 switch(cs_array[i]){ 30 case XYEnum: numdofs+=2; break; 31 case XYZPEnum: numdofs+=4; break; 32 default: _error_("Coordinate system %s not supported yet",EnumToStringx(cs_array[i])); 33 } 34 } 11 35 12 36 /*Copy current load vector*/ … … 15 39 16 40 /*Get Coordinate Systems transform matrix*/ 17 CoordinateSystemTransform(&transform,nodes,numnodes, dofspernode);41 CoordinateSystemTransform(&transform,nodes,numnodes,cs_array); 18 42 19 43 /*Transform matrix: R^T*pe */ 20 MatrixMultiply(transform,num nodes*dofspernode,numnodes*dofspernode,1,44 MatrixMultiply(transform,numdofs,numdofs,1, 21 45 values,pe->nrows,1,0, 22 46 &pe->values[0],0); -
issm/trunk/src/c/shared/Elements/TransformSolutionCoord.cpp
r10407 r10523 4 4 #include "./elements.h" 5 5 6 void TransformSolutionCoord(double* solution,Node** nodes,int numnodes,int dofspernode){ 6 void TransformSolutionCoord(double* solution,Node** nodes,int numnodes,int cs_enum){ 7 8 int* cs_array=NULL; 9 10 /*All nodes have the same Coordinate System*/ 11 cs_array=(int*)xmalloc(numnodes*sizeof(int)); 12 for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum; 13 14 /*Call core*/ 15 TransformSolutionCoord(solution,nodes,numnodes,cs_array); 16 17 /*Clean-up*/ 18 xfree((void**)&cs_array); 19 } 20 21 void TransformSolutionCoord(double* solution,Node** nodes,int numnodes,int* cs_array){ 7 22 8 23 int i,j; 24 int numdofs = 0; 9 25 double *transform = NULL; 10 26 double *values = NULL; 11 27 28 /*Get total number of dofs*/ 29 for(i=0;i<numnodes;i++){ 30 switch(cs_array[i]){ 31 case XYEnum: numdofs+=2; break; 32 case XYZPEnum: numdofs+=4; break; 33 default: _error_("Coordinate system %s not supported yet",EnumToStringx(cs_array[i])); 34 } 35 } 36 12 37 /*Copy current solution vector*/ 13 values=(double*)xmalloc(num nodes*dofspernode*sizeof(double));14 for(i=0;i<num nodes*dofspernode;i++) values[i]=solution[i];38 values=(double*)xmalloc(numdofs*sizeof(double)); 39 for(i=0;i<numdofs;i++) values[i]=solution[i]; 15 40 16 41 /*Get Coordinate Systems transform matrix*/ 17 CoordinateSystemTransform(&transform,nodes,numnodes, dofspernode);42 CoordinateSystemTransform(&transform,nodes,numnodes,cs_array); 18 43 19 44 /*Transform matrix: R*U */ 20 MatrixMultiply(transform,num nodes*dofspernode,numnodes*dofspernode,0,21 values,num nodes*dofspernode,1,0,45 MatrixMultiply(transform,numdofs,numdofs,0, 46 values,numdofs,1,0, 22 47 &solution[0],0); 23 48 -
issm/trunk/src/c/shared/Elements/TransformStiffnessMatrixCoord.cpp
r10407 r10523 4 4 #include "./elements.h" 5 5 6 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int dofspernode){ 6 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum){ 7 8 int* cs_array=NULL; 9 10 /*All nodes have the same Coordinate System*/ 11 cs_array=(int*)xmalloc(numnodes*sizeof(int)); 12 for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum; 13 14 /*Call core*/ 15 TransformStiffnessMatrixCoord(Ke,nodes,numnodes,cs_array); 16 17 /*Clean-up*/ 18 xfree((void**)&cs_array); 19 } 20 21 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array){ 7 22 8 23 int i,j; 24 int numdofs = 0; 9 25 double *transform = NULL; 10 26 double *values = NULL; 27 28 /*Get total number of dofs*/ 29 for(i=0;i<numnodes;i++){ 30 switch(cs_array[i]){ 31 case XYEnum: numdofs+=2; break; 32 case XYZPEnum: numdofs+=4; break; 33 default: _error_("Coordinate system %s not supported yet",EnumToStringx(cs_array[i])); 34 } 35 } 11 36 12 37 /*Copy current stiffness matrix*/ … … 15 40 16 41 /*Get Coordinate Systems transform matrix*/ 17 CoordinateSystemTransform(&transform,nodes,numnodes, dofspernode);42 CoordinateSystemTransform(&transform,nodes,numnodes,cs_array); 18 43 19 44 /*Transform matrix: R^T*Ke*R */ 20 TripleMultiply(transform,num nodes*dofspernode,numnodes*dofspernode,1,45 TripleMultiply(transform,numdofs,numdofs,1, 21 46 values,Ke->nrows,Ke->ncols,0, 22 transform,num nodes*dofspernode,numnodes*dofspernode,0,47 transform,numdofs,numdofs,0, 23 48 &Ke->values[0],0); 24 49 -
issm/trunk/src/c/shared/Elements/elements.h
r10480 r10523 17 17 int* GetLocalDofList( Node** nodes,int numnodes,int setenum,int approximation_enum); 18 18 int* GetGlobalDofList(Node** nodes,int numnodes,int setenum,int approximation_enum); 19 void CoordinateSystemTransform(double** ptransform,Node** nodes,int numnodes,int dofspernode);19 void CoordinateSystemTransform(double** ptransform,Node** nodes,int numnodes,int* cs_array); 20 20 #ifdef _HAVE_DIAGNOSTIC_ 21 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int dofspernode); 22 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int dofspernode); 23 void TransformSolutionCoord(double* solution,Node** nodes,int numnodes,int dofspernode); 21 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum); 22 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array); 23 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum); 24 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array); 25 void TransformSolutionCoord(double* solution,Node** nodes,int numnodes,int cs_enum); 26 void TransformSolutionCoord(double* solution,Node** nodes,int numnodes,int* cs_array); 24 27 #endif 25 28
Note:
See TracChangeset
for help on using the changeset viewer.