Changeset 18504 for issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
- Timestamp:
- 09/11/14 07:07:06 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/SeaiceAnalysis.cpp
r18502 r18504 10 10 }/*}}}*/ 11 11 void SeaiceAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/ 12 parameters->AddObject(iomodel->CopyConstantObject(SeaiceMinConcentrationEnum)); 13 parameters->AddObject(iomodel->CopyConstantObject(SeaiceMinThicknessEnum)); 14 parameters->AddObject(iomodel->CopyConstantObject(SeaiceMaxThicknessEnum)); 12 15 }/*}}}*/ 13 16 void SeaiceAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/ … … 34 37 iomodel->FetchDataToInput(elements,SurfaceforcingsWindVxEnum); 35 38 iomodel->FetchDataToInput(elements,SurfaceforcingsWindVyEnum); 36 iomodel->FetchDataToInput(elements, MaterialsDamageEnum);39 iomodel->FetchDataToInput(elements,DamageEnum); 37 40 iomodel->FetchDataToInput(elements,VxStarEnum); 38 41 iomodel->FetchDataToInput(elements,VyStarEnum); … … 40 43 iomodel->FetchDataToInput(elements,VyEnum); 41 44 iomodel->FetchDataToInput(elements,SeaiceCoriolisFactorEnum); 45 iomodel->FetchDataToInput(elements,StressTensorPredictorxxEnum); 46 iomodel->FetchDataToInput(elements,StressTensorPredictoryyEnum); 47 iomodel->FetchDataToInput(elements,StressTensorPredictorxyEnum); 48 iomodel->FetchDataToInput(elements,MeshXEnum); 49 iomodel->FetchDataToInput(elements,MeshYEnum); 42 50 }/*}}}*/ 43 51 void SeaiceAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/ … … 71 79 /* Check if there is ice in this element */ 72 80 Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input); 73 if(concentration_input->Max()==0.) return NULL; 81 IssmDouble c_min; element->FindParam(&c_min,SeaiceMinConcentrationEnum); 82 if(concentration_input->Max()<=c_min) return NULL; 74 83 75 84 /*Intermediaries */ … … 96 105 element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum); 97 106 element->FindParam(&ocean_turning_angle,BasalforcingsOceanTurningAngleEnum); 98 IssmDouble rho_i = element->GetMaterialParameter(MaterialsRhoIceEnum); 107 IssmDouble rho_i = element->GetMaterialParameter(MaterialsRhoIceEnum); 108 IssmDouble time_relaxation_stress = element->GetMaterialParameter(MaterialsTimeRelaxationStressEnum); 99 109 Input* thickness_input = element->GetInput(SeaiceThicknessEnum); _assert_(thickness_input); 100 110 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); … … 103 113 Input* oceanvy_input = element->GetInput(BasalforcingsOceanVyEnum); _assert_(oceanvy_input); 104 114 115 /*Get minimum inertia to avoid 0 in the line, and time_ratio*/ 116 IssmDouble minimum_inertia = rho_i*0.01; 117 IssmDouble time_ratio=(1-dt/time_relaxation_stress); 118 105 119 /* Start looping on the number of gaussian points: */ 106 120 Gauss* gauss=element->NewGauss(2); … … 116 130 /*Create first part of the stiffness matrix*/ 117 131 this->GetM(M,element,xyz_list,gauss); 118 D_scalar= rho_i*thickness*gauss->weight*Jdet;132 D_scalar=(rho_i*thickness+minimum_inertia)/dt*gauss->weight*Jdet; 119 133 TripleMultiply(M,1,numdof,1, 120 134 &D_scalar,1,1,0, … … 122 136 &Ke->values[0],1); 123 137 124 /*Create Elas itc part*/138 /*Create Elastic part*/ 125 139 this->GetB(B,element,xyz_list,gauss); 126 140 this->CreateCTensor(&C[0][0],element,gauss); 127 141 for(int i=0;i<3;i++){ 128 142 for(int j=0;j<3;j++){ 129 C[i][j] = gauss->weight*Jdet*dt*C[i][j];143 C[i][j] = dt*time_ratio*gauss->weight*Jdet*C[i][j]; 130 144 } 131 145 } … … 141 155 vy_input->GetInputValue(&vy,gauss); 142 156 vnorm = sqrt(pow(oceanvx-vx,2) + pow(oceanvy-vy,2)); 143 D_scalar = dt*concentration*ocean_coef*rho_ocean*(ocean_lin_drag_coef+ocean_quad_drag_coef*vnorm)*cos(ocean_turning_angle)*gauss->weight*Jdet;157 D_scalar = concentration*ocean_coef*rho_ocean*(ocean_lin_drag_coef+ocean_quad_drag_coef*vnorm)*cos(ocean_turning_angle)*gauss->weight*Jdet; 144 158 TripleMultiply(M,1,numdof,1, 145 159 &D_scalar,1,1,0, … … 160 174 /* Check if there is ice in this element */ 161 175 Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input); 162 if(concentration_input->Max()==0.) return NULL; 176 IssmDouble c_min; element->FindParam(&c_min,SeaiceMinConcentrationEnum); 177 if(concentration_input->Max()<=c_min) return NULL; 163 178 164 179 /*Intermediaries */ 165 IssmDouble air_coef,ocean_coef,constant_part ;166 IssmDouble rho_ice,rho_air,rho_ocean,gravity ;180 IssmDouble air_coef,ocean_coef,constant_part,time_relaxation_stress; 181 IssmDouble rho_ice,rho_air,rho_ocean,gravity,omega; 167 182 IssmDouble vx,vy,vxstar,vystar,windvx,windvy,oceanvx,oceanvy,vnorm; 168 183 IssmDouble air_lin_drag_coef,air_quad_drag_coef; 169 184 IssmDouble ocean_lin_drag_coef,ocean_quad_drag_coef; 170 IssmDouble concentration,thickness,coriolis_factor,dt,Jdet; 185 IssmDouble concentration,thickness,coriolis_factor,dt,Jdet,D_scalar; 186 IssmDouble sigma_xx,sigma_yy,sigma_xy,sigma_vec[3]; 171 187 IssmDouble ocean_turning_angle,dssh[2]; 172 188 IssmDouble* xyz_list = NULL; … … 177 193 178 194 /*Initialize Element vector and vectors*/ 179 ElementVector* pe = element->NewElementVector(); 180 IssmDouble* basis = xNew<IssmDouble>(numnodes); 195 ElementVector* pe = element->NewElementVector(); 196 IssmDouble* B = xNew<IssmDouble>(3*numdof); 197 IssmDouble* basis = xNew<IssmDouble>(numnodes); 198 IssmDouble D[3][3] = {0.}; 181 199 182 200 /*Retrieve all inputs and parameters*/ … … 192 210 element->FindParam(&ocean_quad_drag_coef,BasalforcingsOceanQuadDragCoefEnum); 193 211 element->FindParam(&ocean_turning_angle,BasalforcingsOceanTurningAngleEnum); 194 rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum); 195 gravity = element->GetMaterialParameter(ConstantsGEnum); 212 rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum); 213 gravity = element->GetMaterialParameter(ConstantsGEnum); 214 omega = element->GetMaterialParameter(ConstantsOmegaEnum); 215 time_relaxation_stress = element->GetMaterialParameter(MaterialsTimeRelaxationStressEnum); 196 216 Input* thickness_input = element->GetInput(SeaiceThicknessEnum); _assert_(thickness_input); 197 217 Input* coriolis_fact_input = element->GetInput(SeaiceCoriolisFactorEnum); _assert_(coriolis_fact_input); … … 205 225 Input* oceanvy_input = element->GetInput(BasalforcingsOceanVyEnum); _assert_(oceanvy_input); 206 226 Input* oceanssh_input = element->GetInput(BasalforcingsOceanSshEnum); _assert_(oceanssh_input); 227 Input* sigma_xx_input = element->GetInput(StressTensorxxEnum); _assert_(sigma_xx_input); 228 Input* sigma_yy_input = element->GetInput(StressTensoryyEnum); _assert_(sigma_yy_input); 229 Input* sigma_xy_input = element->GetInput(StressTensorxyEnum); _assert_(sigma_xy_input); 230 231 /*Calculate time_ratio*/ 232 IssmDouble time_ratio=(1-dt/time_relaxation_stress); 207 233 208 234 /* Start looping on the number of gaussian points: */ … … 214 240 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 215 241 element->NodalFunctions(basis, gauss); 242 this->GetB(B,element,xyz_list,gauss); 216 243 217 244 /*Get all inputs on gauss point*/ … … 227 254 oceanvx_input->GetInputValue(&oceanvx,gauss); 228 255 oceanvy_input->GetInputValue(&oceanvy,gauss); 256 sigma_xx_input->GetInputValue(&sigma_xx,gauss); 257 sigma_yy_input->GetInputValue(&sigma_yy,gauss); 258 sigma_xy_input->GetInputValue(&sigma_xy,gauss); 229 259 oceanssh_input->GetInputDerivativeValue(&dssh[0],xyz_list,gauss); 230 260 … … 239 269 constant_part = concentration*air_coef*rho_air*(air_lin_drag_coef+air_quad_drag_coef*vnorm); 240 270 for(int i=0;i<numnodes;i++){ 241 pe->values[i*2+0] += dt*constant_part*windvx*Jdet*gauss->weight*basis[i];242 pe->values[i*2+1] += dt*constant_part*windvy*Jdet*gauss->weight*basis[i];271 pe->values[i*2+0] += constant_part*windvx*Jdet*gauss->weight*basis[i]; 272 pe->values[i*2+1] += constant_part*windvy*Jdet*gauss->weight*basis[i]; 243 273 } 244 274 … … 247 277 constant_part = concentration*ocean_coef*rho_ocean*(ocean_lin_drag_coef+ocean_quad_drag_coef*vnorm); 248 278 for(int i=0;i<numnodes;i++){ 249 pe->values[i*2+0] += dt*constant_part*(oceanvy-vy)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i]; 250 pe->values[i*2+1] += dt*constant_part*(vx-oceanvx)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i]; 251 252 pe->values[i*2+0] += dt*constant_part*oceanvx*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i]; 253 pe->values[i*2+1] += dt*constant_part*oceanvy*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i]; 279 pe->values[i*2+0] += constant_part*omega*(oceanvy-vy)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i]; 280 pe->values[i*2+1] += constant_part*omega*(vx-oceanvx)*sin(ocean_turning_angle)*Jdet*gauss->weight*basis[i]; 281 282 pe->values[i*2+0] += constant_part*oceanvx*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i]; 283 pe->values[i*2+1] += constant_part*oceanvy*cos(ocean_turning_angle)*Jdet*gauss->weight*basis[i]; 284 285 pe->values[i*2+0] += (-rho_ice*thickness*gravity*omega*dssh[0])*Jdet*gauss->weight*basis[i]; 286 pe->values[i*2+1] += (-rho_ice*thickness*gravity*omega*dssh[1])*Jdet*gauss->weight*basis[i]; 254 287 } 255 288 256 289 /*Coriolis forces (use ustar)*/ 257 290 for(int i=0;i<numnodes;i++){ 258 pe->values[i*2+0] += dt*(-rho_ice*thickness*coriolis_factor*vystar)*Jdet*gauss->weight*basis[i]; 259 pe->values[i*2+1] += dt*(+rho_ice*thickness*coriolis_factor*vxstar)*Jdet*gauss->weight*basis[i]; 260 261 pe->values[i*2+0] += dt*(-rho_ice*thickness*gravity*dssh[0])*Jdet*gauss->weight*basis[i]; 262 pe->values[i*2+1] += dt*(-rho_ice*thickness*gravity*dssh[1])*Jdet*gauss->weight*basis[i]; 263 } 291 pe->values[i*2+0] += (-rho_ice*thickness*coriolis_factor*vystar)*Jdet*gauss->weight*basis[i]; 292 pe->values[i*2+1] += (+rho_ice*thickness*coriolis_factor*vxstar)*Jdet*gauss->weight*basis[i]; 293 } 294 295 /*Add elastic part of previous time step*/ 296 sigma_vec[0] = sigma_xx; 297 sigma_vec[1] = sigma_yy; 298 sigma_vec[2] = sigma_xy; 299 D[0][0] = D[1][1] = D[2][2] = time_ratio*thickness*Jdet*gauss->weight; 300 TripleMultiply(B,3,numdof,1, 301 &D[0][0],3,3,0, 302 &sigma_vec[0],3,1,0, 303 &pe->values[0],1); 264 304 } 265 305 … … 267 307 xDelete<IssmDouble>(xyz_list); 268 308 xDelete<IssmDouble>(basis); 309 xDelete<IssmDouble>(B); 269 310 delete gauss; 270 311 return pe; … … 323 364 324 365 /*Intermediaries*/ 366 IssmDouble c_min; 325 367 Vector<IssmDouble>* mask = NULL; 326 368 IssmDouble* serial_mask = NULL; 369 370 /*Get minimum concentration allowed*/ 371 femmodel->parameters->FindParam(&c_min,SeaiceMinConcentrationEnum); 327 372 328 373 /*Step 1: update mask of active nodes*/ … … 334 379 int numnodes = element->GetNumberOfNodes(); 335 380 Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input); 336 if(concentration_input->Max()> 0.){381 if(concentration_input->Max()>c_min){ 337 382 for(int in=0;in<numnodes;in++) mask->SetValue(element->nodes[in]->Sid(),1.,INS_VAL); 338 383 } … … 379 424 380 425 /*Get damage input at this location*/ 381 Input* damage_input = element->GetInput( MaterialsDamageEnum);_assert_(damage_input);426 Input* damage_input = element->GetInput(DamageEnum); _assert_(damage_input); 382 427 Input* thickness_input = element->GetInput(SeaiceThicknessEnum); _assert_(thickness_input); 383 428 Input* concentration_input = element->GetInput(SeaiceConcentrationEnum); _assert_(concentration_input); … … 518 563 519 564 /*Get current stress state*/ 520 Input* sigma_xx_input = element->GetInput(StressTensorxxEnum); 521 Input* sigma_yy_input = element->GetInput(StressTensoryyEnum); 522 Input* sigma_xy_input = element->GetInput(StressTensorxyEnum); 523 if(sigma_xx_input) sigma_xx_input->GetInputAverage(&sigma_xx); 524 else sigma_xx = 0.; 525 if(sigma_yy_input) sigma_yy_input->GetInputAverage(&sigma_yy); 526 else sigma_yy = 0.; 527 if(sigma_xy_input) sigma_xy_input->GetInputAverage(&sigma_xy); 528 else sigma_xy = 0.; 565 Input* sigma_xx_input = element->GetInput(StressTensorPredictorxxEnum); _assert_(sigma_xx_input); 566 Input* sigma_yy_input = element->GetInput(StressTensorPredictoryyEnum); _assert_(sigma_yy_input); 567 Input* sigma_xy_input = element->GetInput(StressTensorPredictorxyEnum); _assert_(sigma_xy_input); 568 sigma_xx_input->GetInputAverage(&sigma_xx); 569 sigma_yy_input->GetInputAverage(&sigma_yy); 570 sigma_xy_input->GetInputAverage(&sigma_xy); 529 571 530 572 /* Compute the invariants of the elastic deformation and instantaneous deformation rate */ … … 537 579 538 580 /* estimate the internal constraints using the current elastic deformation */ 539 Input* damage_input = element->GetInput(MaterialsDamageEnum); _assert_(damage_input); 540 Input* damagenew_input = element->GetInput(MaterialsDamageEnum); _assert_(damagenew_input);//FIXME 581 Input* damage_input = element->GetInput(DamageEnum); _assert_(damage_input); 541 582 damage_input->GetInputAverage(&damage); 542 damagenew_input->GetInputAverage(&damage_new);543 583 damage_test = damage; 584 damage_new = damage; 544 585 if(sigma_n>traction || sigma_n<-compression_max){ 545 586 if(sigma_n>traction){ … … 564 605 /* The damage variable is changed */ 565 606 damage_new=damage_test; 566 element->AddInput( MaterialsDamageEnum,&damage_test,P0Enum);//FIXME607 element->AddInput(DamageEnum,&damage_new,P0Enum); 567 608 568 609 /* Recompute the internal stress*/
Note:
See TracChangeset
for help on using the changeset viewer.