Changeset 18235
- Timestamp:
- 07/11/14 11:00:33 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r18227 r18235 2881 2881 int i,dim,epssize; 2882 2882 IssmDouble r,rl,Jdet,viscosity,DU,DUl; 2883 IssmDouble normal[3]; 2883 2884 IssmDouble *xyz_list = NULL; 2884 2885 IssmDouble *xyz_list_base = NULL; … … 2959 2960 element->FindParam(&rl,AugmentedLagrangianRlambdaEnum); 2960 2961 element->GetVerticesCoordinatesBase(&xyz_list_base); 2962 element->NormalBase(&normal[0],xyz_list_base); 2963 2964 int lsize; 2965 IssmDouble* Dlambda = xNewZeroInit<IssmDouble>(dim*dim); 2966 IssmDouble* C = xNewZeroInit<IssmDouble>(dim*lnumdof); 2967 IssmDouble* Cprime = xNewZeroInit<IssmDouble>(dim*numdof); 2961 2968 2962 2969 delete gauss; … … 2966 2973 2967 2974 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 2968 this->GetCFS(C,element,dim,xyz_list _base,gauss);2969 this->GetCFSprime(Cprime,element,dim,xyz_list _base,gauss);2970 DUl = gauss->weight*Jdet*sqrt(rl);2971 TripleMultiply(C, 1,lnumdof,1,2972 &DU,1,1,0,2973 Cprime, 1,numdof,0,2975 this->GetCFS(C,element,dim,xyz_list,gauss); 2976 this->GetCFSprime(Cprime,element,dim,xyz_list,gauss); 2977 for(i=0;i<dim;i++) Dlambda[i*epssize+i] = gauss->weight*Jdet*sqrt(normal[i]*normal[i])*sqrt(rl); 2978 TripleMultiply(C,dim,lnumdof,1, 2979 Dlambda,dim,dim,0, 2980 Cprime,dim,numdof,0, 2974 2981 CtCUzawa,1); 2975 2982 } 2983 /*Delete base part*/ 2984 xDelete<IssmDouble>(xyz_list_base); 2985 xDelete<IssmDouble>(Dlambda); 2986 xDelete<IssmDouble>(C); 2987 xDelete<IssmDouble>(Cprime); 2976 2988 } 2977 2989 … … 3733 3745 int i,dim; 3734 3746 IssmDouble Jdet,r,pressure; 3735 IssmDouble *xyz_list = NULL; 3736 Gauss* gauss = NULL; 3747 IssmDouble bed_normal[3]; 3748 IssmDouble *xyz_list = NULL; 3749 IssmDouble *xyz_list_base = NULL; 3750 Gauss* gauss = NULL; 3737 3751 3738 3752 /*Get problem dimension*/ … … 3757 3771 /*Get d and tau*/ 3758 3772 Input* pressure_input=element->GetInput(PressureEnum); _assert_(pressure_input); 3773 Input* sigmann_input =element->GetInput(SigmaNNEnum); _assert_(sigmann_input); 3759 3774 3760 3775 gauss=element->NewGauss(5); … … 3773 3788 } 3774 3789 } 3790 } 3791 3792 if(element->IsOnBase()){ 3793 3794 IssmDouble sigmann; 3795 IssmDouble* vbasis = xNew<IssmDouble>(numnodes); 3796 3797 element->GetVerticesCoordinatesBase(&xyz_list_base); 3798 element->NormalBase(&bed_normal[0],xyz_list_base); 3799 3800 delete gauss; 3801 Gauss* gauss=element->NewGaussBase(5); 3802 for(int ig=gauss->begin();ig<gauss->end();ig++){ 3803 gauss->GaussPoint(ig); 3804 3805 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 3806 element->NodalFunctionsVelocity(vbasis,gauss); 3807 sigmann_input->GetInputValue(&sigmann, gauss); 3808 3809 for(i=0;i<numnodes;i++){ 3810 pe->values[i*dim+0] += - sigmann*bed_normal[0]*gauss->weight*Jdet*vbasis[i]; 3811 pe->values[i*dim+1] += - sigmann*bed_normal[1]*gauss->weight*Jdet*vbasis[i]; 3812 if(dim==3){ 3813 pe->values[i*dim+2]+= - sigmann*bed_normal[2]*gauss->weight*Jdet*vbasis[i]; 3814 } 3815 } 3816 } 3817 xDelete<IssmDouble>(xyz_list_base); 3818 xDelete<IssmDouble>(vbasis); 3775 3819 } 3776 3820 … … 4410 4454 }/*}}}*/ 4411 4455 void StressbalanceAnalysis::GetCFS(IssmDouble* C,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 4412 /*Compute C matrix. C=[Cp1 Cp2 ...] where Cpi=phi_pi. 4456 /*Compute C matrix. C=[Cp1 Cp2 ...] where: 4457 * Cpi=[phi phi]. 4413 4458 */ 4414 4459 … … 4421 4466 /*Get nodal functions derivatives*/ 4422 4467 IssmDouble* basis =xNew<IssmDouble>(lnumnodes); 4423 element->NodalFunctions P1(basis,gauss);4468 element->NodalFunctions(basis,gauss); 4424 4469 4425 4470 /*Build B: */ 4426 4471 for(int i=0;i<lnumnodes;i++){ 4427 C[i] = basis[i]; 4472 C[i*lnumnodes+0] = basis[i]; 4473 C[i*lnumnodes+1] = basis[i]; 4428 4474 } 4429 4475 … … 4432 4478 }/*}}}*/ 4433 4479 void StressbalanceAnalysis::GetCFSprime(IssmDouble* Cprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 4434 /* Compute C' matrix. C'=[C1' C2' C3'] 4435 * Ci' = [ dphi/dx dphi/dy ] 4480 /* Compute C' matrix. C'=[C1' C2' ...] 4481 * Ci' = [ phi 0 ] 4482 * [ 0 phi ] 4436 4483 * 4437 4484 * In 3d 4438 * Ci=[ dh/dx dh/dy dh/dz ] 4485 * Ci' = [ phi 0 0 ] 4486 * [ 0 phi 0 ] 4487 * [ 0 0 phi ] 4439 4488 * where phi is the finiteelement function for node i. 4440 4489 */ 4441 4490 4442 4491 /*Fetch number of nodes for this finite element*/ 4443 int lnumnodes = element->GetNumberOfNodes(); 4444 4445 /*Get nodal functions derivatives*/ 4446 IssmDouble* dbasis=xNew<IssmDouble>(dim*lnumnodes); 4447 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 4448 4449 /*Build C_prime: */ 4450 if(dim==2){ 4451 for(int i=0;i<lnumnodes;i++){ 4452 Cprime[dim*i+0] = dbasis[0*lnumnodes+i]; 4453 Cprime[dim*i+1] = dbasis[1*lnumnodes+i]; 4492 int vnumnodes = element->GetNumberOfNodes(); 4493 int vnumdof = vnumnodes*dim; 4494 4495 IssmDouble* vbasis=xNew<IssmDouble>(vnumnodes); 4496 element->NodalFunctionsVelocity(vbasis,gauss); 4497 4498 /*Build B: */ 4499 if(dim==3){ 4500 for(int i=0;i<vnumnodes;i++){ 4501 Cprime[vnumdof*0+3*i+0] = vbasis[i]; 4502 Cprime[vnumdof*0+3*i+1] = 0.; 4503 Cprime[vnumdof*0+3*i+2] = 0.; 4504 4505 Cprime[vnumdof*1+3*i+0] = 0.; 4506 Cprime[vnumdof*1+3*i+1] = vbasis[i]; 4507 Cprime[vnumdof*1+3*i+2] = 0.; 4508 4509 Cprime[vnumdof*2+3*i+0] = 0.; 4510 Cprime[vnumdof*2+3*i+1] = 0.; 4511 Cprime[vnumdof*2+3*i+2] = vbasis[i]; 4454 4512 } 4455 4513 } 4456 4514 else{ 4457 for(int i=0;i<lnumnodes;i++){ 4458 Cprime[dim*i+0] = dbasis[0*lnumnodes+i]; 4459 Cprime[dim*i+1] = dbasis[1*lnumnodes+i]; 4460 Cprime[dim*i+2] = dbasis[2*lnumnodes+i]; 4461 } 4462 } 4463 4464 /*Clean up*/ 4465 xDelete<IssmDouble>(dbasis); 4515 for(int i=0;i<vnumnodes;i++){ 4516 Cprime[vnumdof*0+2*i+0] = vbasis[i]; 4517 Cprime[vnumdof*0+2*i+1] = 0.; 4518 4519 Cprime[vnumdof*1+2*i+0] = 0.; 4520 Cprime[vnumdof*1+2*i+1] = vbasis[i]; 4521 } 4522 } 4523 4524 /*Clean-up*/ 4525 xDelete<IssmDouble>(vbasis); 4466 4526 }/*}}}*/ 4467 4527 void StressbalanceAnalysis::GetSolutionFromInputsFS(Vector<IssmDouble>* solution,Element* element){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
r18208 r18235 12 12 13 13 parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRhopEnum)); 14 parameters->AddObject(iomodel->CopyConstantObject(AugmentedLagrangianRholambdaEnum)); 14 15 }/*}}}*/ 15 16 void UzawaPressureAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/ … … 167 168 void UzawaPressureAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 168 169 170 int dim; 169 171 int *doflist = NULL; 172 IssmDouble rholambda,un; 173 IssmDouble bed_normal[3]; 170 174 171 175 /*Fetch number of nodes and dof for this finite element*/ 172 int numnodes = element->GetNumberOfNodes(); 176 int numnodes = element->GetNumberOfNodes(); 177 int numnodessigma = element->NumberofNodes(P2Enum); 178 element->FindParam(&dim,DomainDimensionEnum); 173 179 174 180 /*Fetch dof list and allocate solution vector*/ 175 181 element->GetDofList(&doflist,NoneApproximationEnum,GsetEnum); 176 182 IssmDouble* values = xNew<IssmDouble>(numnodes); 177 IssmDouble* pressure = xNew<IssmDouble>(numnodes); 183 IssmDouble* pressure = xNew<IssmDouble>(numnodes); 184 Input* vx_input= element->GetInput(VxEnum); _assert_(vx_input); 185 Input* vy_input= element->GetInput(VyEnum); _assert_(vy_input); 186 Input* vz_input = NULL; 187 if(dim==3){vz_input =element->GetInput(VzEnum); _assert_(vz_input);} 188 Input* sigmann_input=element->GetInput(SigmaNNEnum); _assert_(vy_input); 178 189 element->GetInputListOnNodes(&pressure[0],PressureEnum); 179 190 191 /*Update pressure enum first*/ 180 192 for(int i=0;i<numnodes;i++){ 181 193 values[i] = pressure[i] + solution[doflist[i]]; 182 194 } 183 184 195 element->AddInput(PressureEnum,values,element->GetElementType()); 185 196 197 /*Now compute sigmann if on base*/ 198 element->GetInputListOnNodes(&sigmann[0],SigmaNNEnum); 199 200 if(element->IsOnBase()){ 201 202 element->NormalBase(&bed_normal[0],xyz_list_tria); 203 element->FindParam(&rholambda,AugmentedLagrangianRholambdaEnum); 204 205 Gauss* gauss = element->NewGauss(); 206 for(int i=0;i<numnodessigma;i++){ 207 gauss->GaussNode(P2Enum,i); 208 209 vx_input->GetInputValue(&vx, gauss); 210 vy_input->GetInputValue(&vy, gauss); 211 un=bed_normal[0]*vx[i] + bed_normal[1]*vy[i]; 212 if(dim==3){ 213 vz_input->GetInputValue(&vz, gauss); 214 un = un + bed_normal[2]*vz[i]; 215 } 216 values[i] = sigmann[i] + rholambda*un; 217 } 218 } 219 element->AddInput(SigmaNNEnum,values,P2Enum)); 220 186 221 /*Free ressources:*/ 222 delete gauss; 187 223 xDelete<IssmDouble>(values); 224 xDelete<IssmDouble>(sigmann); 188 225 xDelete<IssmDouble>(pressure); 189 226 xDelete<int>(doflist);
Note:
See TracChangeset
for help on using the changeset viewer.