Changeset 25264
- Timestamp:
- 07/10/20 21:19:59 (5 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.cpp
r25118 r25264 169 169 ElementMatrix* Ke = basalelement->NewElementMatrix(NoneApproximationEnum); 170 170 IssmDouble* basis = xNew<IssmDouble>(numnodes); 171 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); 172 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); 171 IssmDouble* dbasis = xNew<IssmDouble>(dim*numnodes); 173 172 IssmDouble* D = xNew<IssmDouble>(dim*dim); 174 173 … … 189 188 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 190 189 basalelement->NodalFunctions(basis,gauss); 190 basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 191 191 192 192 vx_input->GetInputValue(&vx,gauss); 193 193 if(dim==2) vy_input->GetInputValue(&vy,gauss); 194 194 195 /*Transient term*/ 195 196 D_scalar=gauss->weight*Jdet; 196 TripleMultiply(basis,1,numnodes,1, 197 &D_scalar,1,1,0, 198 basis,1,numnodes,0, 199 &Ke->values[0],1); 200 201 GetB(B,basalelement,dim,xyz_list,gauss); 202 GetBprime(Bprime,basalelement,dim,xyz_list,gauss); 203 197 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]; 198 199 /*Advection terms*/ 204 200 D_scalar=dt*gauss->weight*Jdet; 205 201 for(int i=0;i<dim*dim;i++) D[i]=0.; 206 D[0] = D_scalar*vx; 207 if(dim==2) D[1*dim+1] = D_scalar*vy; 208 209 TripleMultiply(B,dim,numnodes,1, 210 D,dim,dim,0, 211 Bprime,dim,numnodes,0, 212 &Ke->values[0],1); 202 203 if(dim==1){ 204 /*\phi_i v\cdot\nabla\phi_j*/ 205 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[i]*vx*dbasis[0*numnodes+j]; 206 } 207 else{ 208 _assert_(dim==2); 209 for(int i=0;i<numnodes;i++){ 210 for(int j=0;j<numnodes;j++){ 211 /*\phi_i v\cdot\nabla\phi_j*/ 212 Ke->values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]); 213 } 214 } 215 } 213 216 214 217 if(stabilization==2){ … … 241 244 if(stabilization==1 || stabilization==2){ 242 245 for(int i=0;i<dim*dim;i++) D[i]=D_scalar*D[i]; 243 TripleMultiply(Bprime,dim,numnodes,1, 244 D,dim,dim,0, 245 Bprime,dim,numnodes,0, 246 &Ke->values[0],1); 246 if(dim==2){ 247 for(int i=0;i<numnodes;i++){ 248 for(int j=0;j<numnodes;j++){ 249 Ke->values[i*numnodes+j] += ( 250 dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) + 251 dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j]) 252 ); 253 } 254 } 255 } 256 else{ 257 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += dbasis[0*numnodes+i]*D[0]*dbasis[0*numnodes+j]; 258 } 247 259 } 248 260 } … … 251 263 xDelete<IssmDouble>(xyz_list); 252 264 xDelete<IssmDouble>(basis); 253 xDelete<IssmDouble>(B); 254 xDelete<IssmDouble>(Bprime); 265 xDelete<IssmDouble>(dbasis); 255 266 xDelete<IssmDouble>(D); 256 267 delete gauss; … … 332 343 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 333 344 return pe; 334 335 }/*}}}*/336 void FreeSurfaceBaseAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/337 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*2.338 * For node i, Bi can be expressed in the actual coordinate system339 * by:340 * Bi=[ N ]341 * [ N ]342 * where N is the finiteelement function for node i.343 *344 * We assume B_prog has been allocated already, of size: 2x(1*numnodes)345 */346 347 /*Fetch number of nodes for this finite element*/348 int numnodes = element->GetNumberOfNodes();349 350 /*Get nodal functions*/351 IssmDouble* basis=xNew<IssmDouble>(numnodes);352 element->NodalFunctions(basis,gauss);353 354 /*Build B: */355 for(int i=0;i<numnodes;i++){356 for(int j=0;j<dim;j++){357 B[numnodes*j+i] = basis[i];358 }359 }360 361 /*Clean-up*/362 xDelete<IssmDouble>(basis);363 }/*}}}*/364 void FreeSurfaceBaseAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/365 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*2.366 * For node i, Bi' can be expressed in the actual coordinate system367 * by:368 * Bi_prime=[ dN/dx ]369 * [ dN/dy ]370 * where N is the finiteelement function for node i.371 *372 * We assume B' has been allocated already, of size: 3x(2*numnodes)373 */374 375 /*Fetch number of nodes for this finite element*/376 int numnodes = element->GetNumberOfNodes();377 378 /*Get nodal functions derivatives*/379 IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);380 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);381 382 /*Build B': */383 for(int i=0;i<numnodes;i++){384 for(int j=0;j<dim;j++){385 Bprime[numnodes*j+i] = dbasis[j*numnodes+i];386 }387 }388 389 /*Clean-up*/390 xDelete<IssmDouble>(dbasis);391 345 392 346 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/FreeSurfaceBaseAnalysis.h
r24335 r25264 26 26 ElementMatrix* CreateKMatrix(Element* element); 27 27 ElementVector* CreatePVector(Element* element); 28 void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);29 void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);30 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 31 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index); -
issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.cpp
r25118 r25264 145 145 ElementMatrix* Ke = topelement->NewElementMatrix(NoneApproximationEnum); 146 146 IssmDouble* basis = xNew<IssmDouble>(numnodes); 147 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); 148 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); 147 IssmDouble* dbasis = xNew<IssmDouble>(dim*numnodes); 149 148 IssmDouble* D = xNew<IssmDouble>(dim*dim); 150 149 … … 165 164 topelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 166 165 topelement->NodalFunctions(basis,gauss); 166 topelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 167 167 168 168 vx_input->GetInputValue(&vx,gauss); 169 169 if(dim==2) vy_input->GetInputValue(&vy,gauss); 170 170 171 /*Transient term*/ 171 172 D_scalar=gauss->weight*Jdet; 172 TripleMultiply(basis,1,numnodes,1, 173 &D_scalar,1,1,0, 174 basis,1,numnodes,0, 175 &Ke->values[0],1); 176 177 GetB(B,topelement,dim,xyz_list,gauss); 178 GetBprime(Bprime,topelement,dim,xyz_list,gauss); 179 173 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]; 174 175 /*Advection terms*/ 180 176 D_scalar=dt*gauss->weight*Jdet; 181 177 for(int i=0;i<dim*dim;i++) D[i]=0.; … … 183 179 if(dim==2) D[1*dim+1]=D_scalar*vy; 184 180 185 TripleMultiply(B,dim,numnodes,1, 186 D,dim,dim,0, 187 Bprime,dim,numnodes,0, 188 &Ke->values[0],1); 181 if(dim==1){ 182 /*\phi_i v\cdot\nabla\phi_j*/ 183 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[i]*vx*dbasis[0*numnodes+j]; 184 } 185 else{ 186 _assert_(dim==2); 187 for(int i=0;i<numnodes;i++){ 188 for(int j=0;j<numnodes;j++){ 189 /*\phi_i v\cdot\nabla\phi_j*/ 190 Ke->values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]); 191 } 192 } 193 } 189 194 190 195 if(stabilization==2){ … … 218 223 if(stabilization==1 || stabilization==2){ 219 224 for(int i=0;i<dim*dim;i++) D[i]=D_scalar*D[i]; 220 TripleMultiply(Bprime,dim,numnodes,1, 221 D,dim,dim,0, 222 Bprime,dim,numnodes,0, 223 &Ke->values[0],1); 225 if(dim==2){ 226 for(int i=0;i<numnodes;i++){ 227 for(int j=0;j<numnodes;j++){ 228 Ke->values[i*numnodes+j] += ( 229 dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) + 230 dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j]) 231 ); 232 } 233 } 234 } 235 else{ 236 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += dbasis[0*numnodes+i]*D[0]*dbasis[0*numnodes+j]; 237 } 224 238 } 225 239 } … … 228 242 xDelete<IssmDouble>(xyz_list); 229 243 xDelete<IssmDouble>(basis); 230 xDelete<IssmDouble>(B); 231 xDelete<IssmDouble>(Bprime); 244 xDelete<IssmDouble>(dbasis); 232 245 xDelete<IssmDouble>(D); 233 246 delete gauss; … … 306 319 307 320 }/*}}}*/ 308 void FreeSurfaceTopAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/309 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*2.310 * For node i, Bi can be expressed in the actual coordinate system311 * by:312 * Bi=[ N ]313 * [ N ]314 * where N is the finiteelement function for node i.315 *316 * We assume B_prog has been allocated already, of size: 2x(1*numnodes)317 */318 319 /*Fetch number of nodes for this finite element*/320 int numnodes = element->GetNumberOfNodes();321 322 /*Get nodal functions*/323 IssmDouble* basis=xNew<IssmDouble>(numnodes);324 element->NodalFunctions(basis,gauss);325 326 /*Build B: */327 for(int i=0;i<numnodes;i++){328 for(int j=0;j<dim;j++){329 B[numnodes*j+i] = basis[i];330 }331 }332 333 /*Clean-up*/334 xDelete<IssmDouble>(basis);335 }/*}}}*/336 void FreeSurfaceTopAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/337 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*2.338 * For node i, Bi' can be expressed in the actual coordinate system339 * by:340 * Bi_prime=[ dN/dx ]341 * [ dN/dy ]342 * where N is the finiteelement function for node i.343 *344 * We assume B' has been allocated already, of size: 3x(2*numnodes)345 */346 347 /*Fetch number of nodes for this finite element*/348 int numnodes = element->GetNumberOfNodes();349 350 /*Get nodal functions derivatives*/351 IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);352 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);353 354 /*Build B': */355 for(int i=0;i<numnodes;i++){356 for(int j=0;j<dim;j++){357 Bprime[numnodes*j+i] = dbasis[j*numnodes+i];358 }359 }360 361 /*Clean-up*/362 xDelete<IssmDouble>(dbasis);363 364 }/*}}}*/365 321 void FreeSurfaceTopAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ 366 322 _error_("not implemented yet"); -
issm/trunk-jpl/src/c/analyses/FreeSurfaceTopAnalysis.h
r24335 r25264 26 26 ElementMatrix* CreateKMatrix(Element* element); 27 27 ElementVector* CreatePVector(Element* element); 28 void GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);29 void GetBprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss);30 28 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 31 29 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
Note:
See TracChangeset
for help on using the changeset viewer.