Changeset 22510
- Timestamp:
- 03/09/18 11:32:45 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r22371 r22510 2336 2336 2337 2337 /*Initialize Element matrix and vectors*/ 2338 ElementMatrix* Ke = element->NewElementMatrix(HOApproximationEnum); 2339 IssmDouble* B = xNew<IssmDouble>((dim-1)*numdof); 2340 IssmDouble* D = xNewZeroInit<IssmDouble>((dim-1)*(dim-1)); 2338 ElementMatrix* Ke = element->NewElementMatrix(HOApproximationEnum); 2339 IssmDouble* basis = xNew<IssmDouble>(numnodes); 2341 2340 2342 2341 /*Retrieve all inputs and parameters*/ … … 2370 2369 } 2371 2370 2372 this->GetBHOFriction(B,element,dim,xyz_list_base,gauss);2373 2371 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 2374 for(int i=0;i<dim-1;i++) D[i*(dim-1)+i]=alpha2*gauss->weight*Jdet; 2375 2376 TripleMultiply(B,dim-1,numdof,1, 2377 D,dim-1,dim-1,0, 2378 B,dim-1,numdof,0, 2379 &Ke->values[0],1); 2372 element->NodalFunctions(basis,gauss); 2373 2374 if(dim==3){ 2375 for(int i=0;i<numnodes;i++){ 2376 for(int j=0;j<numnodes;j++){ 2377 Ke->values[2*i*2*numnodes+2*j] += alpha2*gauss->weight*Jdet*basis[i]*basis[j]; 2378 Ke->values[(2*i+1)*2*numnodes+2*j+1] += alpha2*gauss->weight*Jdet*basis[i]*basis[j]; 2379 } 2380 } 2381 } 2382 else{ 2383 for(int i=0;i<numnodes;i++){ 2384 for(int j=0;j<numnodes;j++){ 2385 Ke->values[i*numnodes+j] += alpha2*gauss->weight*Jdet*basis[i]*basis[j]; 2386 } 2387 } 2388 } 2380 2389 } 2381 2390 … … 2387 2396 delete friction; 2388 2397 xDelete<IssmDouble>(xyz_list_base); 2389 xDelete<IssmDouble>(B); 2390 xDelete<IssmDouble>(D); 2398 xDelete<IssmDouble>(basis); 2391 2399 return Ke; 2392 2400 }/*}}}*/ … … 2400 2408 IssmDouble viscosity,newviscosity,oldviscosity; 2401 2409 IssmDouble viscosity_overshoot,thickness,Jdet; 2402 IssmDouble D_scalar;2403 2410 IssmDouble *xyz_list = NULL; 2404 2411 2405 2412 /*Get problem dimension*/ 2406 2413 element->FindParam(&dim,DomainDimensionEnum); 2407 if(dim==2) bsize = 2;2408 else bsize = 5;2409 2414 2410 2415 /*Fetch number of nodes and dof for this finite element*/ … … 2414 2419 /*Initialize Element matrix and vectors*/ 2415 2420 ElementMatrix* Ke = element->NewElementMatrix(HOApproximationEnum); 2416 IssmDouble* B = xNew<IssmDouble>(bsize*numdof); 2417 IssmDouble* Bprime = xNew<IssmDouble>(bsize*numdof); 2418 IssmDouble* D = xNewZeroInit<IssmDouble>(bsize*bsize); 2421 IssmDouble* dbasis = xNew<IssmDouble>(dim*numnodes); 2419 2422 2420 2423 /*Retrieve all inputs and parameters*/ … … 2436 2439 2437 2440 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 2438 this->GetBHO(B,element,dim,xyz_list,gauss); 2439 this->GetBHOprime(Bprime,element,dim,xyz_list,gauss); 2440 2441 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 2441 2442 element->material->ViscosityHO(&viscosity,dim,xyz_list,gauss,vx_input,vy_input); 2442 2443 element->material->ViscosityHO(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input); 2443 2444 2444 2445 newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity); 2445 D_scalar=2.*newviscosity*gauss->weight*Jdet; 2446 for(int i=0;i<bsize;i++) D[i*bsize+i]=D_scalar; 2447 2448 TripleMultiply(B,bsize,numdof,1, 2449 D,bsize,bsize,0, 2450 Bprime,bsize,numdof,0, 2451 &Ke->values[0],1); 2446 2447 if(dim==3){ 2448 for(int i=0;i<numnodes;i++){ 2449 for(int j=0;j<numnodes;j++){ 2450 Ke->values[2*i*2*numnodes+2*j] += gauss->weight*Jdet*newviscosity*( 2451 4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[2*numnodes+j]*dbasis[2*numnodes+i] 2452 ); 2453 Ke->values[2*i*2*numnodes+2*j+1] += gauss->weight*Jdet*newviscosity*( 2454 2.*dbasis[1*numnodes+j]*dbasis[0*numnodes+i] + dbasis[0*numnodes+j]*dbasis[1*numnodes+i] 2455 ); 2456 Ke->values[(2*i+1)*2*numnodes+2*j] += gauss->weight*Jdet*newviscosity*( 2457 2.*dbasis[0*numnodes+j]*dbasis[1*numnodes+i] + dbasis[1*numnodes+j]*dbasis[0*numnodes+i] 2458 ); 2459 Ke->values[(2*i+1)*2*numnodes+2*j+1] += gauss->weight*Jdet*newviscosity*( 2460 dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + 4.*dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[2*numnodes+j]*dbasis[2*numnodes+i] 2461 ); 2462 } 2463 } 2464 } 2465 else{ 2466 for(int i=0;i<numnodes;i++){ 2467 for(int j=0;j<numnodes;j++){ 2468 Ke->values[i*numnodes+j] += gauss->weight*Jdet*newviscosity*( 2469 4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i] 2470 ); 2471 } 2472 } 2473 } 2452 2474 } 2453 2475 … … 2458 2480 delete gauss; 2459 2481 xDelete<IssmDouble>(xyz_list); 2460 xDelete<IssmDouble>(D); 2461 xDelete<IssmDouble>(Bprime); 2462 xDelete<IssmDouble>(B); 2482 xDelete<IssmDouble>(dbasis); 2463 2483 return Ke; 2464 2484 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.