Changeset 5932
- Timestamp:
- 09/21/10 16:46:28 (15 years ago)
- Location:
- issm/trunk/src/c/objects/Elements
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/objects/Elements/Penta.cpp
r5931 r5932 789 789 break; 790 790 case ThermalAnalysisEnum: 791 CreatePVectorThermal( pg); 791 pe=CreatePVectorThermal(); 792 if(pe) pe->AddToGlobal(pg,pf); 793 if(pe) delete pe; 792 794 break; 793 795 case MeltingAnalysisEnum: 794 CreatePVectorMelting( pg); 796 pe=CreatePVectorMelting(); 797 if(pe) pe->AddToGlobal(pg,pf); 798 if(pe) delete pe; 795 799 break; 796 800 default: … … 3736 3740 /*}}}*/ 3737 3741 /*FUNCTION Penta::CreatePVectorMelting {{{1*/ 3738 void Penta::CreatePVectorMelting( Vec pg){3739 return ;3742 ElementVector* Penta::CreatePVectorMelting(void){ 3743 return NULL; 3740 3744 } 3741 3745 /*}}}*/ … … 3777 3781 /*}}}*/ 3778 3782 /*FUNCTION Penta::CreatePVectorThermal {{{1*/ 3779 void Penta::CreatePVectorThermal( Vec pg){ 3780 3781 /*indexing: */ 3783 ElementVector* Penta::CreatePVectorThermal(void){ 3784 3785 /*compute all load vectorsfor this element*/ 3786 ElementVector* pe1=CreatePVectorThermalVolume(); 3787 ElementVector* pe2=CreatePVectorThermalSheet(); 3788 ElementVector* pe3=CreatePVectorThermalShelf(); 3789 ElementVector* pe =new ElementVector(pe1,pe2,pe3); 3790 3791 /*clean-up and return*/ 3792 delete pe1; 3793 delete pe2; 3794 delete pe3; 3795 return pe; 3796 } 3797 /*}}}*/ 3798 /*FUNCTION Penta::CreatePVectorThermalVolume {{{1*/ 3799 ElementVector* Penta::CreatePVectorThermalVolume(void){ 3800 3801 const int numdof=NUMVERTICES*NDOF1; 3782 3802 int i,j; 3803 int ig; 3783 3804 int found=0; 3784 3785 const int numdof=NUMVERTICES*NDOF1;3786 int* doflist=NULL;3787 3788 /*Grid data: */3789 3805 double xyz_list[NUMVERTICES][3]; 3790 3791 /* gaussian points: */3792 int ig;3793 3806 GaussPenta *gauss=NULL; 3794 3795 3807 double temperature_list[NUMVERTICES]; 3796 3808 double temperature; 3797 3798 /*Material properties: */3799 3809 double gravity,rho_ice,rho_water; 3800 3810 double mixed_layer_capacity,heatcapacity; 3801 3811 double beta,meltingpoint,thermal_exchange_velocity; 3802 3803 /* element parameters: */3804 3812 int friction_type; 3805 3806 /*matrices: */3807 3813 double P_terms[numdof]={0.0}; 3808 3814 double L[numdof]; … … 3812 3818 double epsilon_sqr[3][3]; 3813 3819 double epsilon_matrix[3][3]; 3814 3815 3820 double Jdet; 3816 3821 double viscosity; … … 3822 3827 double scalar_ocean; 3823 3828 double scalar_transient; 3824 3825 /*Collapsed formulation: */3826 3829 Tria* tria=NULL; 3827 3830 double dt; 3828 3831 3829 /*retrieve some parameters: */ 3832 /*Initialize Element vector and return if necessary*/ 3833 if(IsOnWater()) return NULL; 3834 ElementVector* pe=NewElementVector(nodes,NUMVERTICES,this->parameters); 3835 3836 /*Retrieve all inputs and parameters*/ 3837 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 3830 3838 this->parameters->FindParam(&dt,DtEnum); 3831 3832 /*If on water, skip: */3833 if(IsOnWater())return;3834 3835 /* Get node coordinates and dof list: */3836 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES);3837 GetDofList(&doflist,NoneApproximationEnum,GsetEnum);3838 3839 /*recovre material parameters: */3840 3839 rho_water=matpar->GetRhoWater(); 3841 3840 rho_ice=matpar->GetRhoIce(); … … 3844 3843 beta=matpar->GetBeta(); 3845 3844 meltingpoint=matpar->GetMeltingPoint(); 3846 3847 /*Retrieve all inputs we will be needing: */3848 3845 Input* vx_input=inputs->GetInput(VxEnum); ISSMASSERT(vx_input); 3849 3846 Input* vy_input=inputs->GetInput(VyEnum); ISSMASSERT(vy_input); … … 3860 3857 gauss->GaussPoint(ig); 3861 3858 3862 /*Compute strain rate and viscosity: */3863 3859 this->GetStrainRate3d(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input,vz_input); 3864 3860 matice->GetViscosity3dStokes(&viscosity,&epsilon[0]); 3865 3866 /* Get Jacobian determinant: */3867 3861 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss); 3868 3869 /* Get nodal functions */3870 3862 GetNodalFunctionsP1(&L[0], gauss); 3871 3872 /*Build deformational heating: */3873 3863 GetPhi(&phi, &epsilon[0], viscosity); 3874 3864 3875 /*Build pe_gaussian */3876 3865 scalar_def=phi/(rho_ice*heatcapacity)*Jdet*gauss->weight; 3877 3866 if(dt) scalar_def=scalar_def*dt; 3878 3867 3879 for(i=0;i<NUMVERTICES;i++) P_terms[i]+=scalar_def*L[i];3868 for(i=0;i<NUMVERTICES;i++) pe->values[i]+=scalar_def*L[i]; 3880 3869 3881 3870 /* Build transient now */ … … 3883 3872 temperature_input->GetParameterValue(&temperature, gauss); 3884 3873 scalar_transient=temperature*Jdet*gauss->weight; 3885 for(i=0;i<NUMVERTICES;i++) P_terms[i]+=scalar_transient*L[i]; 3886 } 3887 } 3888 3889 /*Add pe_g to global vector pg: */ 3890 VecSetValues(pg,numdof,doflist,(const double*)P_terms,ADD_VALUES); 3874 for(i=0;i<NUMVERTICES;i++) pe->values[i]+=scalar_transient*L[i]; 3875 } 3876 } 3877 3878 /*Clean up and return*/ 3879 delete gauss; 3880 return pe; 3881 } 3882 /*}}}*/ 3883 /*FUNCTION Penta::CreatePVectorThermalShelf {{{1*/ 3884 ElementVector* Penta::CreatePVectorThermalShelf(void){ 3891 3885 3892 3886 /* Ice/ocean heat exchange flux on ice shelf base */ 3893 if(IsOnBed() && IsOnShelf()){ 3894 3895 tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria. 3896 tria->CreatePVectorThermalShelf(pg); 3897 delete tria->matice; delete tria; 3898 } 3887 if (!IsOnBed() || !IsOnShelf() || IsOnWater()) return NULL; 3888 3889 /*Call Tria function*/ 3890 Tria* tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria. 3891 ElementVector* pe=tria->CreatePVectorThermalShelf(); 3892 delete tria->matice; delete tria; 3893 3894 /*Clean up and return*/ 3895 return pe; 3896 } 3897 /*}}}*/ 3898 /*FUNCTION Penta::CreatePVectorThermalSheet {{{1*/ 3899 ElementVector* Penta::CreatePVectorThermalSheet(void){ 3899 3900 3900 3901 /* Geothermal flux on ice sheet base and basal friction */ 3901 if(IsOnBed() && !IsOnShelf()){ 3902 3903 tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria. 3904 tria->CreatePVectorThermalSheet(pg); 3905 delete tria->matice; delete tria; 3906 } 3907 3908 xfree((void**)&doflist); 3909 delete gauss; 3910 3902 if (!IsOnBed() || IsOnShelf() || IsOnWater()) return NULL; 3903 3904 /*Call Tria function*/ 3905 Tria* tria=(Tria*)SpawnTria(0,1,2); //grids 0, 1 and 2 make the new tria. 3906 ElementVector* pe=tria->CreatePVectorThermalSheet(); 3907 delete tria->matice; delete tria; 3908 3909 /*Clean up and return*/ 3910 return pe; 3911 3911 } 3912 3912 /*}}}*/ -
issm/trunk/src/c/objects/Elements/Penta.h
r5931 r5932 169 169 ElementVector* CreatePVectorAdjointStokes(void); 170 170 void CreatePVectorDiagnosticVert( Vec pg); 171 void CreatePVectorMelting( Vec pg);171 ElementVector* CreatePVectorMelting(void); 172 172 ElementVector* CreatePVectorPrognostic(void); 173 173 ElementVector* CreatePVectorSlope(void); 174 void CreatePVectorThermal( Vec pg); 174 ElementVector* CreatePVectorThermal(void); 175 ElementVector* CreatePVectorThermalVolume(void); 176 ElementVector* CreatePVectorThermalShelf(void); 177 ElementVector* CreatePVectorThermalSheet(void); 175 178 void GetDofList(int** pdoflist,int approximation_enum,int setenum); 176 179 void GetDofList1(int* doflist); -
issm/trunk/src/c/objects/Elements/Tria.cpp
r5926 r5932 4388 4388 /*}}}*/ 4389 4389 /*FUNCTION Tria::CreatePVectorThermalShelf {{{1*/ 4390 void Tria::CreatePVectorThermalShelf( Vec pg){ 4391 4392 int i; 4390 ElementVector* Tria::CreatePVectorThermalShelf(void){ 4393 4391 4394 4392 const int numdof=NUMVERTICES*NDOF1; 4395 int * doflist=NULL;4393 int i; 4396 4394 double xyz_list[NUMVERTICES][3]; 4397 4398 4395 double mixed_layer_capacity; 4399 4396 double thermal_exchange_velocity; … … 4403 4400 double beta; 4404 4401 double meltingpoint; 4405 4406 /*inputs: */4407 4402 double dt; 4408 4403 double pressure; 4409 4410 /* gaussian points: */4411 4404 int ig; 4412 4405 GaussTria* gauss=NULL; 4413 4414 /*matrices: */4415 4406 double Jdet; 4416 double P_terms[numdof]={0.0};4417 4407 double l1l2l3[NUMVERTICES]; 4418 4408 double t_pmp; 4419 4409 double scalar_ocean; 4420 4410 4421 /* Get node coordinates and dof list: */ 4411 /*Initialize Element vector and return if necessary*/ 4412 if(IsOnWater()) return NULL; 4413 ElementVector* pe=NewElementVector(nodes,NUMVERTICES,this->parameters); 4414 4415 /*Retrieve all inputs and parameters*/ 4422 4416 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 4423 GetDofList(&doflist,NoneApproximationEnum,GsetEnum);4424 4425 //recover material parameters4426 4417 mixed_layer_capacity=matpar->GetMixedLayerCapacity(); 4427 4418 thermal_exchange_velocity=matpar->GetThermalExchangeVelocity(); … … 4431 4422 beta=matpar->GetBeta(); 4432 4423 meltingpoint=matpar->GetMeltingPoint(); 4433 4434 /*retrieve some solution parameters: */4435 4424 this->parameters->FindParam(&dt,DtEnum); 4436 4437 /* Ice/ocean heat exchange flux on ice shelf base */4438 4439 /*Retrieve all inputs we will be needing: */4440 4425 Input* pressure_input=inputs->GetInput(PressureEnum); ISSMASSERT(pressure_input); 4441 4426 … … 4446 4431 gauss->GaussPoint(ig); 4447 4432 4448 //Get the Jacobian determinant4449 4433 GetJacobianDeterminant3d(&Jdet, &xyz_list[0][0], gauss); 4450 4451 /*Get nodal functions values: */4452 4434 GetNodalFunctions(&l1l2l3[0], gauss); 4453 4435 4454 /*Get geothermal flux and basal friction */4455 4436 pressure_input->GetParameterValue(&pressure,gauss); 4456 4437 t_pmp=meltingpoint-beta*pressure; 4457 4438 4458 /*Calculate scalar parameter*/4459 4439 scalar_ocean=gauss->weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_velocity*(t_pmp)/(heatcapacity*rho_ice); 4460 4440 if(dt){ … … 4462 4442 } 4463 4443 4464 for(i=0;i<3;i++){ 4465 P_terms[i]+=scalar_ocean*l1l2l3[i]; 4466 } 4467 } 4468 4469 /*Add pe_g to global vector pg: */ 4470 VecSetValues(pg,numdof,doflist,(const double*)P_terms,ADD_VALUES); 4444 for(i=0;i<numdof;i++) pe->values[i]+=scalar_ocean*l1l2l3[i]; 4445 } 4471 4446 4472 4447 /*Clean up and return*/ 4473 4448 delete gauss; 4474 xfree((void**)&doflist);4449 return pe; 4475 4450 } 4476 4451 /*}}}*/ 4477 4452 /*FUNCTION Tria::CreatePVectorThermalSheet {{{1*/ 4478 void Tria::CreatePVectorThermalSheet( Vec pg){ 4479 4453 ElementVector* Tria::CreatePVectorThermalSheet(void){ 4454 4455 const int numdof=NUMVERTICES*NDOF1; 4480 4456 int i; 4481 4482 const int numdof=NUMVERTICES*NDOF1; 4483 int* doflist=NULL; 4457 int ig; 4484 4458 double xyz_list[NUMVERTICES][3]; 4485 4486 4459 double rho_ice; 4487 4460 double heatcapacity; 4488 4489 /*inputs: */4490 4461 double dt; 4491 4462 double pressure_list[3]; … … 4496 4467 double alpha2,vx,vy; 4497 4468 double geothermalflux_value; 4498 4499 /* gaussian points: */4500 int ig;4501 4469 GaussTria* gauss=NULL; 4502 4503 /*matrices: */4504 4470 double Jdet; 4505 4471 double P_terms[numdof]={0.0}; 4506 4472 double l1l2l3[NUMVERTICES]; 4507 4473 double scalar; 4508 4509 4474 int analysis_type; 4510 4475 4511 /*retrive parameters: */ 4476 /*Initialize Element vector and return if necessary*/ 4477 if(IsOnWater()) return NULL; 4478 ElementVector* pe=NewElementVector(nodes,NUMVERTICES,this->parameters); 4479 4480 /*Retrieve all inputs and parameters*/ 4481 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 4512 4482 parameters->FindParam(&analysis_type,AnalysisTypeEnum); 4513 4514 /* Get node coordinates and dof list: */4515 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES);4516 GetDofList(&doflist,NoneApproximationEnum,GsetEnum);4517 4518 //recover material parameters4519 4483 rho_ice=matpar->GetRhoIce(); 4520 4484 heatcapacity=matpar->GetHeatCapacity(); 4521 4522 /*retrieve some parameters: */4523 4485 this->parameters->FindParam(&dt,DtEnum); 4486 Input* vx_input=inputs->GetInput(VxEnum); ISSMASSERT(vx_input); 4487 Input* vy_input=inputs->GetInput(VyEnum); ISSMASSERT(vy_input); 4488 Input* vz_input=inputs->GetInput(VzEnum); ISSMASSERT(vz_input); 4489 Input* geothermalflux_input=inputs->GetInput(GeothermalFluxEnum); ISSMASSERT(geothermalflux_input); 4524 4490 4525 4491 /*Build frictoin element, needed later: */ … … 4528 4494 friction=new Friction("3d",inputs,matpar,analysis_type); 4529 4495 4530 /*Retrieve all inputs we will be needing: */4531 Input* vx_input=inputs->GetInput(VxEnum); ISSMASSERT(vx_input);4532 Input* vy_input=inputs->GetInput(VyEnum); ISSMASSERT(vy_input);4533 Input* vz_input=inputs->GetInput(VzEnum); ISSMASSERT(vz_input);4534 Input* geothermalflux_input=inputs->GetInput(GeothermalFluxEnum); ISSMASSERT(geothermalflux_input);4535 4536 /* Ice/ocean heat exchange flux on ice shelf base */4537 4538 4496 /* Start looping on the number of gauss 2d (nodes on the bedrock) */ 4539 4497 gauss=new GaussTria(2); … … 4542 4500 gauss->GaussPoint(ig); 4543 4501 4544 //Get the Jacobian determinant4545 4502 GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0], gauss); 4546 4547 /*Get nodal functions values: */4548 4503 GetNodalFunctions(&l1l2l3[0], gauss); 4549 4504 4550 /*Get geothermal flux and basal friction */4551 4505 geothermalflux_input->GetParameterValue(&geothermalflux_value,gauss); 4552 4553 /*Friction: */4554 4506 friction->GetAlpha2(&alpha2,gauss,VxEnum,VyEnum,VzEnum); 4555 4507 4556 /*Calculate scalar parameter*/4557 4508 scalar=gauss->weight*Jdet*(basalfriction+geothermalflux_value)/(heatcapacity*rho_ice); 4558 4509 if(dt){ … … 4560 4511 } 4561 4512 4562 for(i=0;i<3;i++){ 4563 P_terms[i]+=scalar*l1l2l3[i]; 4564 } 4565 4566 } 4567 4568 /*Add pe_g to global vector pg: */ 4569 VecSetValues(pg,numdof,doflist,(const double*)P_terms,ADD_VALUES); 4513 for(i=0;i<numdof;i++) pe->values[i]+=scalar*l1l2l3[i]; 4514 } 4570 4515 4571 4516 /*Clean up and return*/ 4572 4517 delete gauss; 4573 4518 delete friction; 4574 xfree((void**)&doflist);4519 return pe; 4575 4520 } 4576 4521 /*}}}*/ -
issm/trunk/src/c/objects/Elements/Tria.h
r5926 r5932 152 152 ElementVector* CreatePVectorPrognostic_DG(void); 153 153 ElementVector* CreatePVectorSlope(void); 154 void CreatePVectorThermalSheet( Vec pg);155 void CreatePVectorThermalShelf( Vec pg);154 ElementVector* CreatePVectorThermalSheet(void); 155 ElementVector* CreatePVectorThermalShelf(void); 156 156 double GetArea(void); 157 157 int GetElementType(void);
Note:
See TracChangeset
for help on using the changeset viewer.