Changeset 20666
- Timestamp:
- 05/30/16 12:00:16 (9 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.cpp
r18929 r20666 49 49 ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrix(Element* element){/*{{{*/ 50 50 51 /*compute all stiffness matrices for this element*/52 ElementMatrix* Ke1=CreateKMatrixVolume(element);53 ElementMatrix* Ke2=CreateKMatrixSurface(element);54 ElementMatrix* Ke3=CreateKMatrixBed(element);55 ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3);56 57 /*clean-up and return*/58 delete Ke1;59 delete Ke2;60 delete Ke3;61 return Ke;62 }/*}}}*/63 ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrixVolume(Element* element){/*{{{*/64 65 51 /*Intermediaries */ 66 int dim;67 52 IssmDouble Jdet,D; 68 53 IssmDouble *xyz_list = NULL; 69 54 70 55 /*Get dimension*/ 56 int dim; 71 57 element->FindParam(&dim,DomainDimensionEnum); 72 58 … … 76 62 /*Initialize Element vector and other vectors*/ 77 63 ElementMatrix* Ke = element->NewElementMatrix(); 78 IssmDouble* B = xNew<IssmDouble>(numnodes); 79 IssmDouble* Bprime = xNew<IssmDouble>(numnodes); 64 IssmDouble* dbasis = xNew<IssmDouble>(dim*numnodes); 80 65 81 66 /*Retrieve all inputs and parameters*/ … … 88 73 89 74 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 90 element->NodalFunctions(Bprime,gauss);91 GetB(B,element,dim,xyz_list,gauss);92 75 D=gauss->weight*Jdet; 76 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 93 77 94 TripleMultiply(B,1,numnodes,1, 95 &D,1,1,0, 96 Bprime,1,numnodes,0, 97 &Ke->values[0],1); 78 for(int i=0;i<numnodes;i++){ 79 for(int j=0;j<numnodes;j++){ 80 Ke->values[i*numnodes+j] += gauss->weight*Jdet*(dbasis[(dim-1)*numnodes+i]*dbasis[(dim-1)*numnodes+j]); 81 } 82 } 98 83 } 99 84 100 85 /*Clean up and return*/ 101 86 xDelete<IssmDouble>(xyz_list); 102 xDelete<IssmDouble>(B);103 xDelete<IssmDouble>(Bprime);104 87 delete gauss; 105 88 return Ke; 106 } 107 /*}}}*/ 108 ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrixSurface(Element* element){/*{{{*/ 109 110 if(!element->IsOnSurface()) return NULL; 111 112 /*Intermediaries */ 113 int dim; 114 IssmDouble Jdet,D,normal[2]; 115 IssmDouble *xyz_list_top = NULL; 116 117 /*Get dimension*/ 118 element->FindParam(&dim,DomainDimensionEnum); 119 120 /*Fetch number of nodes and dof for this finite element*/ 121 int numnodes = element->GetNumberOfNodes(); 122 123 /*Initialize Element vector and other vectors*/ 124 ElementMatrix* Ke = element->NewElementMatrix(); 125 IssmDouble* basis = xNew<IssmDouble>(numnodes); 126 127 /*Retrieve all inputs and parameters*/ 128 element->GetVerticesCoordinatesTop(&xyz_list_top); 129 element->NormalTop(&normal[0],xyz_list_top); 130 131 /* Start looping on the number of gaussian points: */ 132 Gauss* gauss=element->NewGaussTop(2); 133 for(int ig=gauss->begin();ig<gauss->end();ig++){ 134 gauss->GaussPoint(ig); 135 136 element->JacobianDeterminantTop(&Jdet,xyz_list_top,gauss); 137 element->NodalFunctions(basis,gauss); 138 D = - gauss->weight*Jdet*normal[dim-1]; 139 140 TripleMultiply(basis,1,numnodes,1, 141 &D,1,1,0, 142 basis,1,numnodes,0, 143 &Ke->values[0],1); 144 } 145 146 /*Clean up and return*/ 147 xDelete<IssmDouble>(xyz_list_top); 148 xDelete<IssmDouble>(basis); 149 delete gauss; 150 return Ke; 151 } 152 /*}}}*/ 153 ElementMatrix* ExtrudeFromTopAnalysis::CreateKMatrixBed(Element* element){/*{{{*/ 154 155 if(!element->IsOnBase()) return NULL; 156 157 /*Intermediaries */ 158 int dim; 159 IssmDouble Jdet,D,normal[3]; 160 IssmDouble *xyz_list_base = NULL; 161 162 /*Get dimension*/ 163 element->FindParam(&dim,DomainDimensionEnum); 164 165 /*Fetch number of nodes and dof for this finite element*/ 166 int numnodes = element->GetNumberOfNodes(); 167 168 /*Initialize Element vector and other vectors*/ 169 ElementMatrix* Ke = element->NewElementMatrix(); 170 IssmDouble* basis = xNew<IssmDouble>(numnodes); 171 172 /*Retrieve all inputs and parameters*/ 173 element->GetVerticesCoordinatesBase(&xyz_list_base); 174 element->NormalBase(&normal[0],xyz_list_base); 175 176 /* Start looping on the number of gaussian points: */ 177 Gauss* gauss=element->NewGaussBase(2); 178 for(int ig=gauss->begin();ig<gauss->end();ig++){ 179 gauss->GaussPoint(ig); 180 181 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 182 element->NodalFunctions(basis,gauss); 183 D = - gauss->weight*Jdet*normal[dim-1]; 184 185 TripleMultiply(basis,1,numnodes,1, 186 &D,1,1,0, 187 basis,1,numnodes,0, 188 &Ke->values[0],1); 189 } 190 191 /*Clean up and return*/ 192 xDelete<IssmDouble>(xyz_list_base); 193 xDelete<IssmDouble>(basis); 194 delete gauss; 195 return Ke; 196 } 197 /*}}}*/ 89 }/*}}}*/ 198 90 ElementVector* ExtrudeFromTopAnalysis::CreatePVector(Element* element){/*{{{*/ 199 91 return NULL; 200 92 }/*}}}*/ 201 void ExtrudeFromTopAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/202 /* Compute B matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];203 where hi is the interpolation function for node i.*/204 205 /*Fetch number of nodes for this finite element*/206 int numnodes = element->GetNumberOfNodes();207 208 /*Get nodal functions derivatives*/209 IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);210 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);211 212 /*Build B: */213 for(int i=0;i<numnodes;i++){214 B[i] = dbasis[(dim-1)*numnodes+i];215 }216 217 /*Clean-up*/218 xDelete<IssmDouble>(dbasis);219 }220 /*}}}*/221 93 void ExtrudeFromTopAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ 222 94 _error_("not implemented yet"); -
issm/trunk-jpl/src/c/analyses/ExtrudeFromTopAnalysis.h
r18929 r20666 25 25 ElementMatrix* CreateJacobianMatrix(Element* element); 26 26 ElementMatrix* CreateKMatrix(Element* element); 27 ElementMatrix* CreateKMatrixBed(Element* element);28 ElementMatrix* CreateKMatrixSurface(Element* element);29 ElementMatrix* CreateKMatrixVolume(Element* element);30 27 ElementVector* CreatePVector(Element* element); 31 void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);32 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 33 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
Note:
See TracChangeset
for help on using the changeset viewer.