Changeset 16904
- Timestamp:
- 11/23/13 09:20:22 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.cpp
r16858 r16904 97 97 /*Finite Element Analysis*/ 98 98 ElementMatrix* HydrologyDCEfficientAnalysis::CreateKMatrix(Element* element){/*{{{*/ 99 _error_("not implemented yet"); 99 100 /*Intermediaries*/ 101 int meshtype; 102 Element* basalelement; 103 104 /*Get basal element*/ 105 element->FindParam(&meshtype,MeshTypeEnum); 106 switch(meshtype){ 107 case Mesh2DhorizontalEnum: 108 basalelement = element; 109 break; 110 case Mesh3DEnum: 111 if(!element->IsOnBed()) return NULL; 112 basalelement = element->SpawnBasalElement(); 113 break; 114 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 115 } 116 117 /*Check that all nodes are active, else return empty matrix*/ 118 if(!basalelement->AllActive()) return NULL; 119 120 /* Intermediaries */ 121 IssmDouble D_scalar,Jdet,dt; 122 IssmDouble epl_thickness; 123 IssmDouble *xyz_list = NULL; 124 125 /*Fetch number of nodes and dof for this finite element*/ 126 int numnodes = basalelement->GetNumberOfNodes(); 127 128 /*Initialize Element vector*/ 129 ElementMatrix* Ke = element->NewElementMatrix(); 130 IssmDouble* B = xNew<IssmDouble>(2*numnodes); 131 IssmDouble* basis = xNew<IssmDouble>(numnodes); 132 IssmDouble D[2][2]={0.}; 133 134 /*Retrieve all inputs and parameters*/ 135 basalelement->GetVerticesCoordinates(&xyz_list); 136 basalelement->FindParam(&dt,TimesteppingTimeStepEnum); 137 Input* thickness_input=element->GetInput(HydrologydcEplThicknessEnum); _assert_(thickness_input); 138 IssmDouble epl_specificstoring = EplSpecificStoring(basalelement); 139 IssmDouble epl_conductivity = element->GetMaterialParameter(HydrologydcEplConductivityEnum); 140 141 /* Start looping on the number of gaussian points: */ 142 Gauss* gauss=element->NewGauss(2); 143 for(int ig=gauss->begin();ig<gauss->end();ig++){ 144 gauss->GaussPoint(ig); 145 146 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 147 thickness_input->GetInputValue(&epl_thickness,gauss); 148 149 /*Diffusivity*/ 150 D_scalar=epl_conductivity*epl_thickness*gauss->weight*Jdet; 151 if(dt!=0.) D_scalar=D_scalar*dt; 152 D[0][0]=D_scalar; 153 D[1][1]=D_scalar; 154 GetB(B,element,xyz_list,gauss); 155 TripleMultiply(B,2,numnodes,1, 156 &D[0][0],2,2,0, 157 B,2,numnodes,0, 158 &Ke->values[0],1); 159 160 /*Transient*/ 161 if(dt!=0.){ 162 element->NodalFunctions(basis,gauss); 163 D_scalar=epl_specificstoring*epl_thickness*gauss->weight*Jdet; 164 165 TripleMultiply(basis,numnodes,1,0, 166 &D_scalar,1,1,0, 167 basis,1,numnodes,0, 168 &Ke->values[0],1); 169 } 170 } 171 172 /*Clean up and return*/ 173 xDelete<IssmDouble>(xyz_list); 174 xDelete<IssmDouble>(basis); 175 xDelete<IssmDouble>(B); 176 delete gauss; 177 return Ke; 178 179 100 180 }/*}}}*/ 101 181 ElementVector* HydrologyDCEfficientAnalysis::CreatePVector(Element* element){/*{{{*/ … … 200 280 return rho_freshwater*g*epl_porosity*(water_compressibility+(epl_compressibility/epl_porosity)); 201 281 }/*}}}*/ 282 void HydrologyDCEfficientAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 283 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 284 * For node i, Bi can be expressed in the actual coordinate system 285 * by: 286 * Bi=[ dN/dx ] 287 * [ dN/dy ] 288 * where N is the finiteelement function for node i. 289 * 290 * We assume B has been allocated already, of size: 3x(NDOF2*numnodes) 291 */ 292 293 /*Fetch number of nodes for this finite element*/ 294 int numnodes = element->GetNumberOfNodes(); 295 296 /*Get nodal functions derivatives*/ 297 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes); 298 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 299 300 /*Build B: */ 301 for(int i=0;i<numnodes;i++){ 302 B[numnodes*0+i] = dbasis[0*numnodes+i]; 303 B[numnodes*1+i] = dbasis[1*numnodes+i]; 304 } 305 306 /*Clean-up*/ 307 xDelete<IssmDouble>(dbasis); 308 }/*}}}*/ -
issm/trunk-jpl/src/c/analyses/HydrologyDCEfficientAnalysis.h
r16853 r16904 27 27 28 28 /*Intermediaries*/ 29 void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss); 29 30 IssmDouble EplSpecificStoring(Element* element); 30 31 }; -
issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp
r16903 r16904 259 259 case HydrologydcEplPorosityEnum: return this->epl_porosity; 260 260 case HydrologydcEplCompressibilityEnum: return this->epl_compressibility; 261 case HydrologydcEplConductivityEnum: return this->epl_conductivity; 262 case HydrologydcEplInitialThicknessEnum: return this->epl_init_thickness; 261 263 case HydrologydcWaterCompressibilityEnum: return this->water_compressibility; 262 264 case HydrologydcSedimentTransmitivityEnum: return this->sediment_transmitivity;
Note:
See TracChangeset
for help on using the changeset viewer.