Changeset 17255
- Timestamp:
- 02/11/14 13:41:23 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/classes
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r17248 r17255 53 53 return false; 54 54 }/*}}}*/ 55 void Element::CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes_list,int numnodes,int* cs_array){/*{{{*/ 56 57 int i,counter; 58 int numdofs = 0; 59 IssmDouble norm; 60 IssmDouble *transform = NULL; 61 IssmDouble coord_system[3][3]; 62 63 /*Some checks in debugging mode*/ 64 _assert_(numnodes && nodes_list); 65 66 /*Get total number of dofs*/ 67 for(i=0;i<numnodes;i++){ 68 switch(cs_array[i]){ 69 case PressureEnum: numdofs+=1; break; 70 case XYEnum: numdofs+=2; break; 71 case XYZEnum: numdofs+=3; break; 72 default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet"); 73 } 74 } 75 76 /*Allocate and initialize transform matrix*/ 77 transform=xNew<IssmDouble>(numdofs*numdofs); 78 for(i=0;i<numdofs*numdofs;i++) transform[i]=0.0; 79 80 /*Create transform matrix for all nodes (x,y for 2d and x,y,z for 3d). It is a block matrix 81 *for 3 nodes: 82 83 * | T1 0 0 | 84 * Q = | 0 T2 0 | 85 * | 0 0 T3| 86 * 87 * Where T1 is the transform matrix for node 1. It is a simple copy of the coordinate system 88 * associated to this node*/ 89 counter=0; 90 for(i=0;i<numnodes;i++){ 91 nodes_list[i]->GetCoordinateSystem(&coord_system[0][0]); 92 switch(cs_array[i]){ 93 case PressureEnum: 94 /*DO NOT change anything*/ 95 transform[(numdofs)*(counter) + counter] = 1.; 96 counter+=1; 97 break; 98 case XYEnum: 99 /*We remove the z component, we need to renormalize x and y: x=[x1 x2 0] y=[-x2 x1 0]*/ 100 norm = sqrt( coord_system[0][0]*coord_system[0][0] + coord_system[1][0]*coord_system[1][0]); _assert_(norm>1.e-4); 101 transform[(numdofs)*(counter+0) + counter+0] = coord_system[0][0]/norm; 102 transform[(numdofs)*(counter+0) + counter+1] = - coord_system[1][0]/norm; 103 transform[(numdofs)*(counter+1) + counter+0] = coord_system[1][0]/norm; 104 transform[(numdofs)*(counter+1) + counter+1] = coord_system[0][0]/norm; 105 counter+=2; 106 break; 107 case XYZEnum: 108 /*The 3 coordinates are changed (x,y,z)*/ 109 transform[(numdofs)*(counter+0) + counter+0] = coord_system[0][0]; 110 transform[(numdofs)*(counter+0) + counter+1] = coord_system[0][1]; 111 transform[(numdofs)*(counter+0) + counter+2] = coord_system[0][2]; 112 transform[(numdofs)*(counter+1) + counter+0] = coord_system[1][0]; 113 transform[(numdofs)*(counter+1) + counter+1] = coord_system[1][1]; 114 transform[(numdofs)*(counter+1) + counter+2] = coord_system[1][2]; 115 transform[(numdofs)*(counter+2) + counter+0] = coord_system[2][0]; 116 transform[(numdofs)*(counter+2) + counter+1] = coord_system[2][1]; 117 transform[(numdofs)*(counter+2) + counter+2] = coord_system[2][2]; 118 counter+=3; 119 break; 120 default: 121 _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet"); 122 } 123 } 124 125 /*Assign output pointer*/ 126 *ptransform=transform; 127 } 128 /*}}}*/ 55 129 void Element::DeleteMaterials(void){/*{{{*/ 56 130 delete this->material; … … 537 611 }/*}}}*/ 538 612 void Element::TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum){/*{{{*/ 539 ::TransformInvStiffnessMatrixCoord(Ke,this->nodes,this->GetNumberOfNodes(),transformenum); 540 }/*}}}*/ 541 void Element::TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list){/*{{{*/ 542 ::TransformInvStiffnessMatrixCoord(Ke,nodes_list,numnodes,transformenum_list); 613 614 /*All nodes have the same Coordinate System*/ 615 int numnodes = this->GetNumberOfNodes(); 616 int* cs_array = xNew<int>(numnodes); 617 for(int i=0;i<numnodes;i++) cs_array[i]=transformenum; 618 619 /*Call core*/ 620 TransformInvStiffnessMatrixCoord(Ke,this->nodes,numnodes,cs_array); 621 622 /*Clean-up*/ 623 xDelete<int>(cs_array); 624 }/*}}}*/ 625 void Element::TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* cs_array){/*{{{*/ 626 627 int i,j; 628 int numdofs = 0; 629 IssmDouble *transform = NULL; 630 IssmDouble *values = NULL; 631 632 /*Get total number of dofs*/ 633 for(i=0;i<numnodes;i++){ 634 switch(cs_array[i]){ 635 case PressureEnum: numdofs+=1; break; 636 case XYEnum: numdofs+=2; break; 637 case XYZEnum: numdofs+=3; break; 638 default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet"); 639 } 640 } 641 642 /*Copy current stiffness matrix*/ 643 values=xNew<IssmDouble>(Ke->nrows*Ke->ncols); 644 for(i=0;i<Ke->nrows;i++) for(j=0;j<Ke->ncols;j++) values[i*Ke->ncols+j]=Ke->values[i*Ke->ncols+j]; 645 646 /*Get Coordinate Systems transform matrix*/ 647 CoordinateSystemTransform(&transform,nodes_list,numnodes,cs_array); 648 649 /*Transform matrix: R*Ke*R^T */ 650 TripleMultiply(transform,numdofs,numdofs,0, 651 values,Ke->nrows,Ke->ncols,0, 652 transform,numdofs,numdofs,1, 653 &Ke->values[0],0); 654 655 /*Free Matrix*/ 656 xDelete<IssmDouble>(transform); 657 xDelete<IssmDouble>(values); 543 658 }/*}}}*/ 544 659 void Element::TransformLoadVectorCoord(ElementVector* pe,int transformenum){/*{{{*/ 545 ::TransformLoadVectorCoord(pe,this->nodes,this->GetNumberOfNodes(),transformenum); 546 }/*}}}*/ 547 void Element::TransformLoadVectorCoord(ElementVector* pe,int* transformenum_list){/*{{{*/ 548 ::TransformLoadVectorCoord(pe,this->nodes,this->GetNumberOfNodes(),transformenum_list); 660 661 /*All nodes have the same Coordinate System*/ 662 int numnodes = this->GetNumberOfNodes(); 663 int* cs_array = xNew<int>(numnodes); 664 for(int i=0;i<numnodes;i++) cs_array[i]=transformenum; 665 666 /*Call core*/ 667 this->TransformLoadVectorCoord(pe,this->nodes,numnodes,cs_array); 668 669 /*Clean-up*/ 670 xDelete<int>(cs_array); 671 }/*}}}*/ 672 void Element::TransformLoadVectorCoord(ElementVector* pe,int* cs_array){/*{{{*/ 673 674 this->TransformLoadVectorCoord(pe,this->nodes,this->GetNumberOfNodes(),cs_array); 675 676 }/*}}}*/ 677 void Element::TransformLoadVectorCoord(ElementVector* pe,Node** nodes_list,int numnodes,int* cs_array){/*{{{*/ 678 679 int i; 680 int numdofs = 0; 681 IssmDouble *transform = NULL; 682 IssmDouble *values = NULL; 683 684 /*Get total number of dofs*/ 685 for(i=0;i<numnodes;i++){ 686 switch(cs_array[i]){ 687 case PressureEnum: numdofs+=1; break; 688 case XYEnum: numdofs+=2; break; 689 case XYZEnum: numdofs+=3; break; 690 default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet"); 691 } 692 } 693 694 /*Copy current load vector*/ 695 values=xNew<IssmDouble>(pe->nrows); 696 for(i=0;i<pe->nrows;i++) values[i]=pe->values[i]; 697 698 /*Get Coordinate Systems transform matrix*/ 699 CoordinateSystemTransform(&transform,nodes_list,numnodes,cs_array); 700 701 /*Transform matrix: R^T*pe */ 702 MatrixMultiply(transform,numdofs,numdofs,1, 703 values,pe->nrows,1,0, 704 &pe->values[0],0); 705 706 /*Free Matrices*/ 707 xDelete<IssmDouble>(transform); 708 xDelete<IssmDouble>(values); 549 709 }/*}}}*/ 550 710 void Element::TransformSolutionCoord(IssmDouble* values,int transformenum){/*{{{*/ 551 ::TransformSolutionCoord(values,this->nodes,this->GetNumberOfNodes(),transformenum); 711 712 /*All nodes have the same Coordinate System*/ 713 int numnodes = this->GetNumberOfNodes(); 714 int* cs_array = xNew<int>(numnodes); 715 for(int i=0;i<numnodes;i++) cs_array[i]=transformenum; 716 717 /*Call core*/ 718 this->TransformSolutionCoord(values,this->nodes,numnodes,cs_array); 719 720 /*Clean-up*/ 721 xDelete<int>(cs_array); 552 722 }/*}}}*/ 553 723 void Element::TransformSolutionCoord(IssmDouble* values,int* transformenum_list){/*{{{*/ 554 ::TransformSolutionCoord(values,this->nodes,this->GetNumberOfNodes(),transformenum_list);724 this->TransformSolutionCoord(values,this->nodes,this->GetNumberOfNodes(),transformenum_list); 555 725 }/*}}}*/ 556 726 void Element::TransformSolutionCoord(IssmDouble* values,int numnodes,int transformenum){/*{{{*/ 557 ::TransformSolutionCoord(values,this->nodes,numnodes,transformenum); 558 }/*}}}*/ 559 void Element::TransformSolutionCoord(IssmDouble* values,int numnodes,int* transformenum_list){/*{{{*/ 560 ::TransformSolutionCoord(values,this->nodes,numnodes,transformenum_list); 561 }/*}}}*/ 562 void Element::TransformLoadVectorCoord(ElementVector* Ke,Node** nodes_list,int numnodes,int* transformenum_list){/*{{{*/ 563 ::TransformLoadVectorCoord(Ke,nodes_list,numnodes,transformenum_list); 727 this->TransformSolutionCoord(values,this->nodes,numnodes,transformenum); 728 }/*}}}*/ 729 void Element::TransformSolutionCoord(IssmDouble* solution,int numnodes,int* cs_array){/*{{{*/ 730 this->TransformSolutionCoord(solution,this->nodes,numnodes,cs_array); 731 }/*}}}*/ 732 void Element::TransformSolutionCoord(IssmDouble* values,Node** nodes_list,int numnodes,int transformenum){/*{{{*/ 733 this->TransformSolutionCoord(values,nodes_list,numnodes,transformenum); 734 }/*}}}*/ 735 void Element::TransformSolutionCoord(IssmDouble* solution,Node** nodes_list,int numnodes,int* cs_array){/*{{{*/ 736 737 int i; 738 int numdofs = 0; 739 IssmDouble *transform = NULL; 740 IssmDouble *values = NULL; 741 742 /*Get total number of dofs*/ 743 for(i=0;i<numnodes;i++){ 744 switch(cs_array[i]){ 745 case PressureEnum: numdofs+=1; break; 746 case XYEnum: numdofs+=2; break; 747 case XYZEnum: numdofs+=3; break; 748 default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet"); 749 } 750 } 751 752 /*Copy current solution vector*/ 753 values=xNew<IssmDouble>(numdofs); 754 for(i=0;i<numdofs;i++) values[i]=solution[i]; 755 756 /*Get Coordinate Systems transform matrix*/ 757 CoordinateSystemTransform(&transform,nodes_list,numnodes,cs_array); 758 759 /*Transform matrix: R*U */ 760 MatrixMultiply(transform,numdofs,numdofs,0, 761 values,numdofs,1,0, 762 &solution[0],0); 763 764 /*Free Matrices*/ 765 xDelete<IssmDouble>(transform); 766 xDelete<IssmDouble>(values); 564 767 }/*}}}*/ 565 768 void Element::TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum){/*{{{*/ 566 ::TransformStiffnessMatrixCoord(Ke,this->nodes,this->GetNumberOfNodes(),transformenum); 769 770 /*All nodes have the same Coordinate System*/ 771 int numnodes = this->GetNumberOfNodes(); 772 int* cs_array = xNew<int>(numnodes); 773 for(int i=0;i<numnodes;i++) cs_array[i]=transformenum; 774 775 /*Call core*/ 776 this->TransformStiffnessMatrixCoord(Ke,this->nodes,numnodes,cs_array); 777 778 /*Clean-up*/ 779 xDelete<int>(cs_array); 567 780 }/*}}}*/ 568 781 void Element::TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* transformenum_list){/*{{{*/ 569 ::TransformStiffnessMatrixCoord(Ke,this->nodes,this->GetNumberOfNodes(),transformenum_list); 570 }/*}}}*/ 571 void Element::TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list){/*{{{*/ 572 ::TransformStiffnessMatrixCoord(Ke,nodes_list,numnodes,transformenum_list); 573 }/*}}}*/ 782 this->TransformStiffnessMatrixCoord(Ke,this->nodes,this->GetNumberOfNodes(),transformenum_list); 783 }/*}}}*/ 784 void Element::TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* cs_array){/*{{{*/ 785 786 int numdofs = 0; 787 IssmDouble *transform = NULL; 788 IssmDouble *values = NULL; 789 790 /*Get total number of dofs*/ 791 for(int i=0;i<numnodes;i++){ 792 switch(cs_array[i]){ 793 case PressureEnum: numdofs+=1; break; 794 case XYEnum: numdofs+=2; break; 795 case XYZEnum: numdofs+=3; break; 796 default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet"); 797 } 798 } 799 800 /*Copy current stiffness matrix*/ 801 values=xNew<IssmDouble>(Ke->nrows*Ke->ncols); 802 for(int i=0;i<Ke->nrows*Ke->ncols;i++) values[i]=Ke->values[i]; 803 804 /*Get Coordinate Systems transform matrix*/ 805 CoordinateSystemTransform(&transform,nodes_list,numnodes,cs_array); 806 807 /*Transform matrix: R^T*Ke*R */ 808 TripleMultiply(transform,numdofs,numdofs,1, 809 values,Ke->nrows,Ke->ncols,0, 810 transform,numdofs,numdofs,0, 811 &Ke->values[0],0); 812 813 /*Free Matrix*/ 814 xDelete<IssmDouble>(transform); 815 xDelete<IssmDouble>(values); 816 }/*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r17242 r17255 54 54 bool AllActive(void); 55 55 bool AnyActive(void); 56 void CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array); 56 57 void DeleteMaterials(void); 57 58 void FindParam(bool* pvalue,int paramenum); … … 73 74 void StrainRateFS(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input); 74 75 IssmDouble TMeltingPoint(IssmDouble pressure); 76 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum); 77 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum); 78 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array); 79 void TransformLoadVectorCoord(ElementVector* pe,int cs_enum); 80 void TransformLoadVectorCoord(ElementVector* pe,int* cs_array); 81 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum); 82 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array); 83 void TransformSolutionCoord(IssmDouble* solution,int cs_enum); 84 void TransformSolutionCoord(IssmDouble* solution,int* cs_array); 85 void TransformSolutionCoord(IssmDouble* solution,int numnodes,int cs_enum); 86 void TransformSolutionCoord(IssmDouble* solution,int numnodes,int* cs_array); 87 void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum); 88 void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array); 89 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int cs_enum); 90 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* cs_array); 91 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum); 92 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array); 75 93 void ViscousHeatingCreateInput(void); 76 94 void ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input); … … 81 99 void ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon); 82 100 void ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon); 83 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum);84 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list);85 void TransformLoadVectorCoord(ElementVector* pe,int transformenum);86 void TransformLoadVectorCoord(ElementVector* pe,int* transformenum_list);87 101 void TransformLoadVectorCoord(ElementVector* pe,int numnodes,int transformenum){_error_("not implemented yet");};/*Tiling only*/ 88 102 void TransformLoadVectorCoord(ElementVector* pe,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/ 89 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes_list,int numnodes,int* transformenum_list);90 void TransformSolutionCoord(IssmDouble* values,int transformenum);91 void TransformSolutionCoord(IssmDouble* values,int* transformenum_list);92 void TransformSolutionCoord(IssmDouble* values,int numnodes,int transformenum);93 void TransformSolutionCoord(IssmDouble* values,int numnodes,int* transformenum_list);94 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int transformenum);95 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int* transformenum_list);96 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int transformenum);97 103 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,int numnodes,int* transformenum_list){_error_("not implemented yet");};/*Tiling only*/ 98 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes_list,int numnodes,int* transformenum_list);99 104 100 105 /*Virtual functions*/ -
issm/trunk-jpl/src/c/classes/Node.cpp
r17236 r17255 896 896 } 897 897 /*}}}*/ 898 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum){/*{{{*/899 900 int* cs_array=NULL;901 902 /*All nodes have the same Coordinate System*/903 cs_array=xNew<int>(numnodes);904 for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;905 906 /*Call core*/907 TransformInvStiffnessMatrixCoord(Ke,nodes,numnodes,cs_array);908 909 /*Clean-up*/910 xDelete<int>(cs_array);911 }912 /*}}}*/913 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array){/*{{{*/914 915 int i,j;916 int numdofs = 0;917 IssmDouble *transform = NULL;918 IssmDouble *values = NULL;919 920 /*Get total number of dofs*/921 for(i=0;i<numnodes;i++){922 switch(cs_array[i]){923 case PressureEnum: numdofs+=1; break;924 case XYEnum: numdofs+=2; break;925 case XYZEnum: numdofs+=3; break;926 default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");927 }928 }929 930 /*Copy current stiffness matrix*/931 values=xNew<IssmDouble>(Ke->nrows*Ke->ncols);932 for(i=0;i<Ke->nrows;i++) for(j=0;j<Ke->ncols;j++) values[i*Ke->ncols+j]=Ke->values[i*Ke->ncols+j];933 934 /*Get Coordinate Systems transform matrix*/935 CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);936 937 /*Transform matrix: R*Ke*R^T */938 TripleMultiply(transform,numdofs,numdofs,0,939 values,Ke->nrows,Ke->ncols,0,940 transform,numdofs,numdofs,1,941 &Ke->values[0],0);942 943 /*Free Matrix*/944 xDelete<IssmDouble>(transform);945 xDelete<IssmDouble>(values);946 }947 /*}}}*/948 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum){/*{{{*/949 950 int* cs_array=NULL;951 952 /*All nodes have the same Coordinate System*/953 cs_array=xNew<int>(numnodes);954 for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;955 956 /*Call core*/957 TransformLoadVectorCoord(pe,nodes,numnodes,cs_array);958 959 /*Clean-up*/960 xDelete<int>(cs_array);961 }962 /*}}}*/963 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array){/*{{{*/964 965 int i;966 int numdofs = 0;967 IssmDouble *transform = NULL;968 IssmDouble *values = NULL;969 970 /*Get total number of dofs*/971 for(i=0;i<numnodes;i++){972 switch(cs_array[i]){973 case PressureEnum: numdofs+=1; break;974 case XYEnum: numdofs+=2; break;975 case XYZEnum: numdofs+=3; break;976 default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");977 }978 }979 980 /*Copy current load vector*/981 values=xNew<IssmDouble>(pe->nrows);982 for(i=0;i<pe->nrows;i++) values[i]=pe->values[i];983 984 /*Get Coordinate Systems transform matrix*/985 CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);986 987 /*Transform matrix: R^T*pe */988 MatrixMultiply(transform,numdofs,numdofs,1,989 values,pe->nrows,1,0,990 &pe->values[0],0);991 992 /*Free Matrices*/993 xDelete<IssmDouble>(transform);994 xDelete<IssmDouble>(values);995 }996 /*}}}*/997 void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum){/*{{{*/998 999 int* cs_array=NULL;1000 1001 /*All nodes have the same Coordinate System*/1002 cs_array=xNew<int>(numnodes);1003 for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;1004 1005 /*Call core*/1006 TransformSolutionCoord(solution,nodes,numnodes,cs_array);1007 1008 /*Clean-up*/1009 xDelete<int>(cs_array);1010 }1011 /*}}}*/1012 void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array){/*{{{*/1013 1014 int i;1015 int numdofs = 0;1016 IssmDouble *transform = NULL;1017 IssmDouble *values = NULL;1018 1019 /*Get total number of dofs*/1020 for(i=0;i<numnodes;i++){1021 switch(cs_array[i]){1022 case PressureEnum: numdofs+=1; break;1023 case XYEnum: numdofs+=2; break;1024 case XYZEnum: numdofs+=3; break;1025 default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");1026 }1027 }1028 1029 /*Copy current solution vector*/1030 values=xNew<IssmDouble>(numdofs);1031 for(i=0;i<numdofs;i++) values[i]=solution[i];1032 1033 /*Get Coordinate Systems transform matrix*/1034 CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);1035 1036 /*Transform matrix: R*U */1037 MatrixMultiply(transform,numdofs,numdofs,0,1038 values,numdofs,1,0,1039 &solution[0],0);1040 1041 /*Free Matrices*/1042 xDelete<IssmDouble>(transform);1043 xDelete<IssmDouble>(values);1044 }1045 /*}}}*/1046 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum){/*{{{*/1047 1048 int* cs_array=NULL;1049 1050 /*All nodes have the same Coordinate System*/1051 cs_array=xNew<int>(numnodes);1052 for(int i=0;i<numnodes;i++) cs_array[i]=cs_enum;1053 1054 /*Call core*/1055 TransformStiffnessMatrixCoord(Ke,nodes,numnodes,cs_array);1056 1057 /*Clean-up*/1058 xDelete<int>(cs_array);1059 }1060 /*}}}*/1061 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array){/*{{{*/1062 1063 int numdofs = 0;1064 IssmDouble *transform = NULL;1065 IssmDouble *values = NULL;1066 1067 /*Get total number of dofs*/1068 for(int i=0;i<numnodes;i++){1069 switch(cs_array[i]){1070 case PressureEnum: numdofs+=1; break;1071 case XYEnum: numdofs+=2; break;1072 case XYZEnum: numdofs+=3; break;1073 default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");1074 }1075 }1076 1077 /*Copy current stiffness matrix*/1078 values=xNew<IssmDouble>(Ke->nrows*Ke->ncols);1079 for(int i=0;i<Ke->nrows*Ke->ncols;i++) values[i]=Ke->values[i];1080 1081 /*Get Coordinate Systems transform matrix*/1082 CoordinateSystemTransform(&transform,nodes,numnodes,cs_array);1083 1084 /*Transform matrix: R^T*Ke*R */1085 TripleMultiply(transform,numdofs,numdofs,1,1086 values,Ke->nrows,Ke->ncols,0,1087 transform,numdofs,numdofs,0,1088 &Ke->values[0],0);1089 1090 /*Free Matrix*/1091 xDelete<IssmDouble>(transform);1092 xDelete<IssmDouble>(values);1093 }1094 /*}}}*/1095 void CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array){/*{{{*/1096 1097 int i,counter;1098 int numdofs = 0;1099 IssmDouble norm;1100 IssmDouble *transform = NULL;1101 IssmDouble coord_system[3][3];1102 1103 /*Some checks in debugging mode*/1104 _assert_(numnodes && nodes);1105 1106 /*Get total number of dofs*/1107 for(i=0;i<numnodes;i++){1108 switch(cs_array[i]){1109 case PressureEnum: numdofs+=1; break;1110 case XYEnum: numdofs+=2; break;1111 case XYZEnum: numdofs+=3; break;1112 default: _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");1113 }1114 }1115 1116 /*Allocate and initialize transform matrix*/1117 transform=xNew<IssmDouble>(numdofs*numdofs);1118 for(i=0;i<numdofs*numdofs;i++) transform[i]=0.0;1119 1120 /*Create transform matrix for all nodes (x,y for 2d and x,y,z for 3d). It is a block matrix1121 *for 3 nodes:1122 1123 * | T1 0 0 |1124 * Q = | 0 T2 0 |1125 * | 0 0 T3|1126 *1127 * Where T1 is the transform matrix for node 1. It is a simple copy of the coordinate system1128 * associated to this node*/1129 counter=0;1130 for(i=0;i<numnodes;i++){1131 nodes[i]->GetCoordinateSystem(&coord_system[0][0]);1132 switch(cs_array[i]){1133 case PressureEnum:1134 /*DO NOT change anything*/1135 transform[(numdofs)*(counter) + counter] = 1.;1136 counter+=1;1137 break;1138 case XYEnum:1139 /*We remove the z component, we need to renormalize x and y: x=[x1 x2 0] y=[-x2 x1 0]*/1140 norm = sqrt( coord_system[0][0]*coord_system[0][0] + coord_system[1][0]*coord_system[1][0]); _assert_(norm>1.e-4);1141 transform[(numdofs)*(counter+0) + counter+0] = coord_system[0][0]/norm;1142 transform[(numdofs)*(counter+0) + counter+1] = - coord_system[1][0]/norm;1143 transform[(numdofs)*(counter+1) + counter+0] = coord_system[1][0]/norm;1144 transform[(numdofs)*(counter+1) + counter+1] = coord_system[0][0]/norm;1145 counter+=2;1146 break;1147 case XYZEnum:1148 /*The 3 coordinates are changed (x,y,z)*/1149 transform[(numdofs)*(counter+0) + counter+0] = coord_system[0][0];1150 transform[(numdofs)*(counter+0) + counter+1] = coord_system[0][1];1151 transform[(numdofs)*(counter+0) + counter+2] = coord_system[0][2];1152 transform[(numdofs)*(counter+1) + counter+0] = coord_system[1][0];1153 transform[(numdofs)*(counter+1) + counter+1] = coord_system[1][1];1154 transform[(numdofs)*(counter+1) + counter+2] = coord_system[1][2];1155 transform[(numdofs)*(counter+2) + counter+0] = coord_system[2][0];1156 transform[(numdofs)*(counter+2) + counter+1] = coord_system[2][1];1157 transform[(numdofs)*(counter+2) + counter+2] = coord_system[2][2];1158 counter+=3;1159 break;1160 default:1161 _error_("Coordinate system " << EnumToStringx(cs_array[i]) << " not supported yet");1162 }1163 }1164 1165 /*Assign output pointer*/1166 *ptransform=transform;1167 }1168 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Node.h
r17236 r17255 89 89 int* GetGlobalDofList(Node** nodes,int numnodes,int setenum,int approximation); 90 90 int GetNumberOfDofs(Node** nodes,int numnodes,int setenum,int approximation); 91 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);92 void TransformInvStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);93 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int cs_enum);94 void TransformLoadVectorCoord(ElementVector* pe,Node** nodes,int numnodes,int* cs_array);95 void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int cs_enum);96 void TransformSolutionCoord(IssmDouble* solution,Node** nodes,int numnodes,int* cs_array);97 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int cs_enum);98 void TransformStiffnessMatrixCoord(ElementMatrix* Ke,Node** nodes,int numnodes,int* cs_array);99 void CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array);100 91 101 92 #endif /* _NODE_H_ */
Note:
See TracChangeset
for help on using the changeset viewer.