Changeset 16903
- Timestamp:
- 11/23/13 08:47:33 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.cpp ¶
r16853 r16903 83 83 /*Finite Element Analysis*/ 84 84 ElementMatrix* HydrologyShreveAnalysis::CreateKMatrix(Element* element){/*{{{*/ 85 _error_("not implemented yet"); 85 86 /*Intermediaries */ 87 IssmDouble diffusivity; 88 IssmDouble Jdet,D_scalar,dt,h; 89 IssmDouble vx,vy,vel,dvxdx,dvydy; 90 IssmDouble dvx[2],dvy[2]; 91 IssmDouble* xyz_list = NULL; 92 93 /*Fetch number of nodes and dof for this finite element*/ 94 int numnodes = element->GetNumberOfNodes(); 95 96 /*Initialize Element vector and other vectors*/ 97 ElementMatrix* Ke = element->NewElementMatrix(); 98 IssmDouble* basis = xNew<IssmDouble>(numnodes); 99 IssmDouble* B = xNew<IssmDouble>(2*numnodes); 100 IssmDouble* Bprime = xNew<IssmDouble>(2*numnodes); 101 IssmDouble D[2][2]={0.}; 102 103 /*Create water velocity vx and vy from current inputs*/ 104 CreateHydrologyWaterVelocityInput(element); 105 106 /*Retrieve all inputs and parameters*/ 107 element->GetVerticesCoordinates(&xyz_list); 108 element->FindParam(&dt,TimesteppingTimeStepEnum); 109 Input* vx_input=element->GetInput(HydrologyWaterVxEnum); _assert_(vx_input); 110 Input* vy_input=element->GetInput(HydrologyWaterVyEnum); _assert_(vy_input); 111 h = element->CharacteristicLength(); 112 113 /* Start looping on the number of gaussian points: */ 114 Gauss* gauss=element->NewGauss(2); 115 for(int ig=gauss->begin();ig<gauss->end();ig++){ 116 gauss->GaussPoint(ig); 117 118 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 119 element->NodalFunctions(basis,gauss); 120 121 vx_input->GetInputValue(&vx,gauss); 122 vy_input->GetInputValue(&vy,gauss); 123 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 124 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 125 126 D_scalar=gauss->weight*Jdet; 127 128 TripleMultiply(basis,1,numnodes,1, 129 &D_scalar,1,1,0, 130 basis,1,numnodes,0, 131 Ke->values,1); 132 133 GetB(B,element,xyz_list,gauss); 134 GetBprime(Bprime,element,xyz_list,gauss); 135 136 dvxdx=dvx[0]; 137 dvydy=dvy[1]; 138 D_scalar=dt*gauss->weight*Jdet; 139 140 D[0][0]=D_scalar*dvxdx; 141 D[1][1]=D_scalar*dvydy; 142 TripleMultiply(B,2,numnodes,1, 143 &D[0][0],2,2,0, 144 B,2,numnodes,0, 145 &Ke->values[0],1); 146 147 D[0][0]=D_scalar*vx; 148 D[1][1]=D_scalar*vy; 149 TripleMultiply(B,2,numnodes,1, 150 &D[0][0],2,2,0, 151 Bprime,2,numnodes,0, 152 &Ke->values[0],1); 153 154 /*Artificial diffusivity*/ 155 vel=sqrt(vx*vx+vy*vy); 156 D[0][0]=D_scalar*diffusivity*h/(2*vel)*vx*vx; 157 D[1][0]=D_scalar*diffusivity*h/(2*vel)*vy*vx; 158 D[0][1]=D_scalar*diffusivity*h/(2*vel)*vx*vy; 159 D[1][1]=D_scalar*diffusivity*h/(2*vel)*vy*vy; 160 TripleMultiply(Bprime,2,numnodes,1, 161 &D[0][0],2,2,0, 162 Bprime,2,numnodes,0, 163 &Ke->values[0],1); 164 } 165 166 /*Clean up and return*/ 167 xDelete<IssmDouble>(xyz_list); 168 xDelete<IssmDouble>(basis); 169 xDelete<IssmDouble>(B); 170 xDelete<IssmDouble>(Bprime); 171 delete gauss; 172 return Ke; 86 173 }/*}}}*/ 87 174 ElementVector* HydrologyShreveAnalysis::CreatePVector(Element* element){/*{{{*/ … … 134 221 return pe; 135 222 }/*}}}*/ 223 void HydrologyShreveAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 224 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 225 * For node i, Bi can be expressed in the actual coordinate system 226 * by: 227 * Bi=[ N ] 228 * [ N ] 229 * where N is the finiteelement function for node i. 230 * 231 * We assume B_prog has been allocated already, of size: 2x(NDOF1*numnodes) 232 */ 233 234 /*Fetch number of nodes for this finite element*/ 235 int numnodes = element->GetNumberOfNodes(); 236 237 /*Get nodal functions*/ 238 IssmDouble* basis=xNew<IssmDouble>(numnodes); 239 element->NodalFunctions(basis,gauss); 240 241 /*Build B: */ 242 for(int i=0;i<numnodes;i++){ 243 B[numnodes*0+i] = basis[i]; 244 B[numnodes*1+i] = basis[i]; 245 } 246 247 /*Clean-up*/ 248 xDelete<IssmDouble>(basis); 249 }/*}}}*/ 250 void HydrologyShreveAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 251 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 252 * For node i, Bi' can be expressed in the actual coordinate system 253 * by: 254 * Bi_prime=[ dN/dx ] 255 * [ dN/dy ] 256 * where N is the finiteelement function for node i. 257 * 258 * We assume B' has been allocated already, of size: 3x(NDOF2*numnodes) 259 */ 260 261 /*Fetch number of nodes for this finite element*/ 262 int numnodes = element->GetNumberOfNodes(); 263 264 /*Get nodal functions derivatives*/ 265 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes); 266 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 267 268 /*Build B': */ 269 for(int i=0;i<numnodes;i++){ 270 Bprime[numnodes*0+i] = dbasis[0*numnodes+i]; 271 Bprime[numnodes*1+i] = dbasis[1*numnodes+i]; 272 } 273 274 /*Clean-up*/ 275 xDelete<IssmDouble>(dbasis); 276 277 }/*}}}*/ 136 278 void HydrologyShreveAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ 137 279 element->GetSolutionFromInputsOneDof(solution,WatercolumnEnum); … … 163 305 xDelete<int>(doflist); 164 306 }/*}}}*/ 307 308 /*Intermediaries*/ 309 void HydrologyShreveAnalysis::CreateHydrologyWaterVelocityInput(Element* element){/*{{{*/ 310 311 /*Intermediaries*/ 312 IssmDouble dsdx,dsdy,dbdx,dbdy,w; 313 314 /*Retrieve all inputs and parameters*/ 315 IssmDouble rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum); 316 IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoWaterEnum); 317 IssmDouble g = element->GetMaterialParameter(ConstantsGEnum); 318 IssmDouble CR = element->GetMaterialParameter(HydrologyshreveCREnum); 319 IssmDouble n_man = element->GetMaterialParameter(HydrologyshreveNEnum); 320 IssmDouble mu_water = element->GetMaterialParameter(MaterialsMuWaterEnum); 321 Input* surfaceslopex_input = element->GetInput(SurfaceSlopeXEnum); _assert_(surfaceslopex_input); 322 Input* surfaceslopey_input = element->GetInput(SurfaceSlopeYEnum); _assert_(surfaceslopey_input); 323 Input* bedslopex_input = element->GetInput(BedSlopeXEnum); _assert_(bedslopex_input); 324 Input* bedslopey_input = element->GetInput(BedSlopeYEnum); _assert_(bedslopey_input); 325 Input* watercolumn_input = element->GetInput(WatercolumnEnum); _assert_(watercolumn_input); 326 327 /* compute VelocityFactor */ 328 IssmDouble VelocityFactor = n_man*CR*CR*rho_water*g/mu_water; 329 330 /*Fetch number of vertices and allocate output*/ 331 int numvertices = element->GetNumberOfVertices(); 332 IssmDouble* vx = xNew<IssmDouble>(numvertices); 333 IssmDouble* vy = xNew<IssmDouble>(numvertices); 334 335 Gauss* gauss=element->NewGauss(); 336 for(int iv=0;iv<numvertices;iv++){ 337 gauss->GaussVertex(iv); 338 surfaceslopex_input->GetInputValue(&dsdx,gauss); 339 surfaceslopey_input->GetInputValue(&dsdy,gauss); 340 bedslopex_input->GetInputValue(&dbdx,gauss); 341 bedslopey_input->GetInputValue(&dbdy,gauss); 342 watercolumn_input->GetInputValue(&w,gauss); 343 344 /* Water velocity x and y components */ 345 // vx[iv]= - w*w/(12 * mu_water)*(rho_ice*g*dsdx+(rho_water-rho_ice)*g*dbdx); 346 // vy[iv]= - w*w/(12 * mu_water)*(rho_ice*g*dsdy+(rho_water-rho_ice)*g*dbdy); 347 vx[iv]= - w*w/(VelocityFactor* mu_water)*(rho_ice*g*dsdx+(rho_water-rho_ice)*g*dbdx); 348 vy[iv]= - w*w/(VelocityFactor* mu_water)*(rho_ice*g*dsdy+(rho_water-rho_ice)*g*dbdy); 349 } 350 351 /*clean-up*/ 352 delete gauss; 353 354 /*Add to inputs*/ 355 element->AddInput(HydrologyWaterVxEnum,vx,P1Enum); 356 element->AddInput(HydrologyWaterVyEnum,vy,P1Enum); 357 xDelete<IssmDouble>(vx); 358 xDelete<IssmDouble>(vy); 359 }/*}}}*/ -
TabularUnified issm/trunk-jpl/src/c/analyses/HydrologyShreveAnalysis.h ¶
r16782 r16903 25 25 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 26 26 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 27 28 /*Intermediaries*/ 29 void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss); 30 void GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss); 31 void CreateHydrologyWaterVelocityInput(Element* element); 27 32 }; 28 33 #endif -
TabularUnified issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp ¶
r16863 r16903 252 252 IssmDouble* B = xNew<IssmDouble>(2*numnodes); 253 253 IssmDouble* Bprime = xNew<IssmDouble>(2*numnodes); 254 IssmDouble D[2][2] ;254 IssmDouble D[2][2]={0.}; 255 255 256 256 /*Retrieve all inputs and parameters*/ … … 298 298 299 299 D[0][0]=D_scalar*dvxdx; 300 D[0][1]=0.;301 D[1][0]=0.;302 300 D[1][1]=D_scalar*dvydy; 303 301 TripleMultiply(B,2,numnodes,1, … … 326 324 vyaverage_input->GetInputAverage(&vy); 327 325 D[0][0]=h/2.0*fabs(vx); 328 D[0][1]=0.;329 D[1][0]=0.;330 326 D[1][1]=h/2.0*fabs(vy); 331 327 } -
TabularUnified issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp ¶
r16899 r16903 241 241 242 242 switch(enum_in){ 243 case MaterialsRhoIceEnum: return this->rho_ice; 244 case MaterialsRhoWaterEnum: return this->rho_water; 245 case MaterialsRhoFreshwaterEnum: return this->rho_freshwater; 246 case MaterialsMuWaterEnum: return this->mu_water; 247 case MaterialsHeatcapacityEnum: return this->heatcapacity; 248 case MaterialsThermalconductivityEnum: return this->thermalconductivity; 249 case MaterialsTemperateiceconductivityEnum: return this->temperateiceconductivity; 250 case MaterialsLatentheatEnum: return this->latentheat; 251 case MaterialsBetaEnum: return this->beta; 252 case MaterialsMeltingpointEnum: return this->meltingpoint; 253 case ConstantsReferencetemperatureEnum: return this->referencetemperature; 254 case MaterialsMixedLayerCapacityEnum: return this->mixed_layer_capacity; 255 case MaterialsThermalExchangeVelocityEnum: return this->thermal_exchange_velocity; 256 case HydrologydcSedimentPorosityEnum: return this->sediment_porosity; 257 case HydrologydcSedimentThicknessEnum: return this->sediment_thickness; 258 case HydrologydcSedimentCompressibilityEnum:return this->sediment_compressibility; 259 case HydrologydcEplPorosityEnum: return this->epl_porosity; 260 case HydrologydcEplCompressibilityEnum: return this->epl_compressibility; 261 case HydrologydcWaterCompressibilityEnum: return this->water_compressibility; 262 case HydrologydcSedimentTransmitivityEnum: return this->sediment_transmitivity; 263 case ConstantsGEnum: return this->g; 243 case MaterialsRhoIceEnum: return this->rho_ice; 244 case MaterialsRhoWaterEnum: return this->rho_water; 245 case MaterialsRhoFreshwaterEnum: return this->rho_freshwater; 246 case MaterialsMuWaterEnum: return this->mu_water; 247 case MaterialsHeatcapacityEnum: return this->heatcapacity; 248 case MaterialsThermalconductivityEnum: return this->thermalconductivity; 249 case MaterialsTemperateiceconductivityEnum: return this->temperateiceconductivity; 250 case MaterialsLatentheatEnum: return this->latentheat; 251 case MaterialsBetaEnum: return this->beta; 252 case MaterialsMeltingpointEnum: return this->meltingpoint; 253 case ConstantsReferencetemperatureEnum: return this->referencetemperature; 254 case MaterialsMixedLayerCapacityEnum: return this->mixed_layer_capacity; 255 case MaterialsThermalExchangeVelocityEnum: return this->thermal_exchange_velocity; 256 case HydrologydcSedimentPorosityEnum: return this->sediment_porosity; 257 case HydrologydcSedimentThicknessEnum: return this->sediment_thickness; 258 case HydrologydcSedimentCompressibilityEnum: return this->sediment_compressibility; 259 case HydrologydcEplPorosityEnum: return this->epl_porosity; 260 case HydrologydcEplCompressibilityEnum: return this->epl_compressibility; 261 case HydrologydcWaterCompressibilityEnum: return this->water_compressibility; 262 case HydrologydcSedimentTransmitivityEnum: return this->sediment_transmitivity; 263 case HydrologyshreveCREnum: return this->hydro_CR; 264 case HydrologyshreveKnEnum: return this->hydro_kn; 265 case HydrologyshreveNEnum: return this->hydro_n; 266 case HydrologyshrevePEnum: return this->hydro_p; 267 case HydrologyshreveQEnum: return this->hydro_q; 268 case ConstantsGEnum: return this->g; 264 269 default: _error_("Enum "<<EnumToStringx(enum_in)<<" not supported yet"); 265 270 }
Note:
See TracChangeset
for help on using the changeset viewer.