[17802] | 1 | Index: ../trunk-jpl/src/c/analyses/ThermalAnalysis.h
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/analyses/ThermalAnalysis.h (revision 16839)
|
---|
| 4 | +++ ../trunk-jpl/src/c/analyses/ThermalAnalysis.h (revision 16840)
|
---|
| 5 | @@ -21,10 +21,15 @@
|
---|
| 6 |
|
---|
| 7 | /*Finite element Analysis*/
|
---|
| 8 | ElementMatrix* CreateKMatrix(Element* element);
|
---|
| 9 | + ElementMatrix* CreateKMatrixVolume(Element* element);
|
---|
| 10 | + ElementMatrix* CreateKMatrixShelf(Element* element);
|
---|
| 11 | ElementVector* CreatePVector(Element* element);
|
---|
| 12 | ElementVector* CreatePVectorVolume(Element* element);
|
---|
| 13 | ElementVector* CreatePVectorSheet(Element* element);
|
---|
| 14 | ElementVector* CreatePVectorShelf(Element* element);
|
---|
| 15 | + void GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
|
---|
| 16 | + void GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
|
---|
| 17 | + void GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
|
---|
| 18 | void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
|
---|
| 19 | void InputUpdateFromSolution(IssmDouble* solution,Element* element);
|
---|
| 20 | };
|
---|
| 21 | Index: ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
|
---|
| 22 | ===================================================================
|
---|
| 23 | --- ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp (revision 16839)
|
---|
| 24 | +++ ../trunk-jpl/src/c/analyses/ThermalAnalysis.cpp (revision 16840)
|
---|
| 25 | @@ -112,8 +112,191 @@
|
---|
| 26 |
|
---|
| 27 | /*Finite Element Analysis*/
|
---|
| 28 | ElementMatrix* ThermalAnalysis::CreateKMatrix(Element* element){/*{{{*/
|
---|
| 29 | - _error_("not implemented yet");
|
---|
| 30 | +
|
---|
| 31 | + /*compute all stiffness matrices for this element*/
|
---|
| 32 | + ElementMatrix* Ke1=CreateKMatrixVolume(element);
|
---|
| 33 | + ElementMatrix* Ke2=CreateKMatrixShelf(element);
|
---|
| 34 | + ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2);
|
---|
| 35 | +
|
---|
| 36 | + /*clean-up and return*/
|
---|
| 37 | + delete Ke1;
|
---|
| 38 | + delete Ke2;
|
---|
| 39 | + return Ke;
|
---|
| 40 | }/*}}}*/
|
---|
| 41 | +ElementMatrix* ThermalAnalysis::CreateKMatrixVolume(Element* element){/*{{{*/
|
---|
| 42 | +
|
---|
| 43 | + /*Intermediaries */
|
---|
| 44 | + int stabilization;
|
---|
| 45 | + IssmDouble Jdet,dt,u,v,w,um,vm,wm,vel;
|
---|
| 46 | + IssmDouble h,hx,hy,hz,vx,vy,vz;
|
---|
| 47 | + IssmDouble tau_parameter,diameter;
|
---|
| 48 | + IssmDouble D_scalar;
|
---|
| 49 | + IssmDouble* xyz_list = NULL;
|
---|
| 50 | +
|
---|
| 51 | + /*Fetch number of nodes and dof for this finite element*/
|
---|
| 52 | + int numnodes = element->GetNumberOfNodes();
|
---|
| 53 | +
|
---|
| 54 | + /*Initialize Element vector and other vectors*/
|
---|
| 55 | + ElementMatrix* Ke = element->NewElementMatrix();
|
---|
| 56 | + IssmDouble* basis = xNew<IssmDouble>(numnodes);
|
---|
| 57 | + IssmDouble* dbasis = xNew<IssmDouble>(3*numnodes);
|
---|
| 58 | + IssmDouble* B = xNew<IssmDouble>(3*numnodes);
|
---|
| 59 | + IssmDouble* Bprime = xNew<IssmDouble>(3*numnodes);
|
---|
| 60 | + IssmDouble D[3][3]={0.};
|
---|
| 61 | + IssmDouble K[3][3];
|
---|
| 62 | +
|
---|
| 63 | + /*Retrieve all inputs and parameters*/
|
---|
| 64 | + element->GetVerticesCoordinates(&xyz_list);
|
---|
| 65 | + element->FindParam(&dt,TimesteppingTimeStepEnum);
|
---|
| 66 | + element->FindParam(&stabilization,ThermalStabilizationEnum);
|
---|
| 67 | + IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoWaterEnum);
|
---|
| 68 | + IssmDouble rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
|
---|
| 69 | + IssmDouble gravity = element->GetMaterialParameter(ConstantsGEnum);
|
---|
| 70 | + IssmDouble heatcapacity = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
|
---|
| 71 | + IssmDouble thermalconductivity = element->GetMaterialParameter(MaterialsThermalconductivityEnum);
|
---|
| 72 | + IssmDouble kappa = thermalconductivity/(rho_ice*heatcapacity);
|
---|
| 73 | + Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input);
|
---|
| 74 | + Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input);
|
---|
| 75 | + Input* vz_input = element->GetInput(VzEnum); _assert_(vz_input);
|
---|
| 76 | + Input* vxm_input = element->GetInput(VxMeshEnum); _assert_(vxm_input);
|
---|
| 77 | + Input* vym_input = element->GetInput(VyMeshEnum); _assert_(vym_input);
|
---|
| 78 | + Input* vzm_input = element->GetInput(VzMeshEnum); _assert_(vzm_input);
|
---|
| 79 | + if(stabilization==2) diameter=element->MinEdgeLength(xyz_list);
|
---|
| 80 | +
|
---|
| 81 | + /* Start looping on the number of gaussian points: */
|
---|
| 82 | + Gauss* gauss=element->NewGauss(2);
|
---|
| 83 | + for(int ig=gauss->begin();ig<gauss->end();ig++){
|
---|
| 84 | + gauss->GaussPoint(ig);
|
---|
| 85 | +
|
---|
| 86 | + element->JacobianDeterminant(&Jdet,xyz_list,gauss);
|
---|
| 87 | + D_scalar=gauss->weight*Jdet*kappa;
|
---|
| 88 | + if(dt!=0.) D_scalar=D_scalar*dt;
|
---|
| 89 | +
|
---|
| 90 | + /*Conduction: */
|
---|
| 91 | + GetBConduct(B,element,xyz_list,gauss);
|
---|
| 92 | + D[0][0]=D_scalar;
|
---|
| 93 | + D[1][1]=D_scalar;
|
---|
| 94 | + D[2][2]=D_scalar;
|
---|
| 95 | + TripleMultiply(B,3,numnodes,1,
|
---|
| 96 | + &D[0][0],3,3,0,
|
---|
| 97 | + B,3,numnodes,0,
|
---|
| 98 | + &Ke->values[0],1);
|
---|
| 99 | +
|
---|
| 100 | + /*Advection: */
|
---|
| 101 | + GetBAdvec(B,element,xyz_list,gauss);
|
---|
| 102 | + GetBAdvecprime(Bprime,element,xyz_list,gauss);
|
---|
| 103 | + vx_input->GetInputValue(&u,gauss); vxm_input->GetInputValue(&um,gauss); vx=u-um;
|
---|
| 104 | + vy_input->GetInputValue(&v,gauss); vym_input->GetInputValue(&vm,gauss); vy=v-vm;
|
---|
| 105 | + vz_input->GetInputValue(&w,gauss); vzm_input->GetInputValue(&wm,gauss); vz=w-wm;
|
---|
| 106 | + D[0][0]=D_scalar*vx;
|
---|
| 107 | + D[1][1]=D_scalar*vy;
|
---|
| 108 | + D[2][2]=D_scalar*vz;
|
---|
| 109 | + TripleMultiply(B,3,numnodes,1,
|
---|
| 110 | + &D[0][0],3,3,0,
|
---|
| 111 | + Bprime,3,numnodes,0,
|
---|
| 112 | + &Ke->values[0],1);
|
---|
| 113 | +
|
---|
| 114 | + /*Transient: */
|
---|
| 115 | + if(dt!=0.){
|
---|
| 116 | + element->NodalFunctions(basis,gauss);
|
---|
| 117 | +
|
---|
| 118 | + TripleMultiply(basis,numnodes,1,0,
|
---|
| 119 | + &D_scalar,1,1,0,
|
---|
| 120 | + basis,1,numnodes,0,
|
---|
| 121 | + &Ke->values[0],1);
|
---|
| 122 | + }
|
---|
| 123 | +
|
---|
| 124 | + /*Artifficial diffusivity*/
|
---|
| 125 | + if(stabilization==1){
|
---|
| 126 | + element->ElementSizes(&hx,&hy,&hz);
|
---|
| 127 | + vel=sqrt(vx*vx + vy*vy + vz*vz)+1.e-14;
|
---|
| 128 | + h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) + pow(hz*vz/vel,2));
|
---|
| 129 | + K[0][0]=h/(2.*vel)*fabs(vx*vx); K[0][1]=h/(2.*vel)*fabs(vx*vy); K[0][2]=h/(2.*vel)*fabs(vx*vz);
|
---|
| 130 | + K[1][0]=h/(2.*vel)*fabs(vy*vx); K[1][1]=h/(2.*vel)*fabs(vy*vy); K[1][2]=h/(2.*vel)*fabs(vy*vz);
|
---|
| 131 | + K[2][0]=h/(2.*vel)*fabs(vz*vx); K[2][1]=h/(2.*vel)*fabs(vz*vy); K[2][2]=h/(2.*vel)*fabs(vz*vz);
|
---|
| 132 | + for(int i=0;i<3;i++) for(int j=0;j<3;j++) K[i][j] = D_scalar*K[i][j];
|
---|
| 133 | +
|
---|
| 134 | + GetBAdvecprime(Bprime,element,xyz_list,gauss);
|
---|
| 135 | +
|
---|
| 136 | + TripleMultiply(Bprime,3,numnodes,1,
|
---|
| 137 | + &K[0][0],3,3,0,
|
---|
| 138 | + Bprime,3,numnodes,0,
|
---|
| 139 | + &Ke->values[0],1);
|
---|
| 140 | + }
|
---|
| 141 | + else if(stabilization==2){
|
---|
| 142 | + element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
|
---|
| 143 | + tau_parameter=element->StabilizationParameter(u-um,v-vm,w-wm,diameter,kappa);
|
---|
| 144 | + for(int i=0;i<numnodes;i++){
|
---|
| 145 | + for(int j=0;j<numnodes;j++){
|
---|
| 146 | + Ke->values[i*numnodes+j]+=tau_parameter*D_scalar*
|
---|
| 147 | + ((u-um)*dbasis[0*3+i]+(v-vm)*dbasis[1*3+i]+(w-wm)*dbasis[2*3+i])*((u-um)*dbasis[0*3+j]+(v-vm)*dbasis[1*3+j]+(w-wm)*dbasis[2*3+j]);
|
---|
| 148 | + }
|
---|
| 149 | + }
|
---|
| 150 | + if(dt!=0.){
|
---|
| 151 | + for(int i=0;i<numnodes;i++){
|
---|
| 152 | + for(int j=0;j<numnodes;j++){
|
---|
| 153 | + Ke->values[i*numnodes+j]+=tau_parameter*D_scalar*basis[j]*((u-um)*dbasis[0*3+i]+(v-vm)*dbasis[1*3+i]+(w-wm)*dbasis[2*3+i]);
|
---|
| 154 | + }
|
---|
| 155 | + }
|
---|
| 156 | + }
|
---|
| 157 | + }
|
---|
| 158 | + }
|
---|
| 159 | +
|
---|
| 160 | + /*Clean up and return*/
|
---|
| 161 | + delete gauss;
|
---|
| 162 | + return Ke;
|
---|
| 163 | +}/*}}}*/
|
---|
| 164 | +ElementMatrix* ThermalAnalysis::CreateKMatrixShelf(Element* element){/*{{{*/
|
---|
| 165 | +
|
---|
| 166 | + /*Initialize Element matrix and return if necessary*/
|
---|
| 167 | + if(!element->IsOnBed() || !element->IsFloating()) return NULL;
|
---|
| 168 | +
|
---|
| 169 | + IssmDouble dt,Jdet,D;
|
---|
| 170 | + IssmDouble *xyz_list_base = NULL;
|
---|
| 171 | +
|
---|
| 172 | + /*Get basal element*/
|
---|
| 173 | + if(!element->IsOnBed() || !element->IsFloating()) return NULL;
|
---|
| 174 | +
|
---|
| 175 | + /*Fetch number of nodes for this finite element*/
|
---|
| 176 | + int numnodes = element->GetNumberOfNodes();
|
---|
| 177 | +
|
---|
| 178 | + /*Initialize vectors*/
|
---|
| 179 | + ElementMatrix* Ke = element->NewElementMatrix();
|
---|
| 180 | + IssmDouble* basis = xNew<IssmDouble>(numnodes);
|
---|
| 181 | +
|
---|
| 182 | + /*Retrieve all inputs and parameters*/
|
---|
| 183 | + element->GetVerticesCoordinatesBase(&xyz_list_base);
|
---|
| 184 | + element->FindParam(&dt,TimesteppingTimeStepEnum);
|
---|
| 185 | + IssmDouble gravity = element->GetMaterialParameter(ConstantsGEnum);
|
---|
| 186 | + IssmDouble rho_water = element->GetMaterialParameter(MaterialsRhoWaterEnum);
|
---|
| 187 | + IssmDouble rho_ice = element->GetMaterialParameter(MaterialsRhoIceEnum);
|
---|
| 188 | + IssmDouble heatcapacity = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
|
---|
| 189 | + IssmDouble mixed_layer_capacity= element->GetMaterialParameter(MaterialsMixedLayerCapacityEnum);
|
---|
| 190 | + IssmDouble thermal_exchange_vel= element->GetMaterialParameter(MaterialsThermalExchangeVelocityEnum);
|
---|
| 191 | +
|
---|
| 192 | + /* Start looping on the number of gaussian points: */
|
---|
| 193 | + Gauss* gauss=element->NewGaussBase(2);
|
---|
| 194 | + for(int ig=gauss->begin();ig<gauss->end();ig++){
|
---|
| 195 | + gauss->GaussPoint(ig);
|
---|
| 196 | +
|
---|
| 197 | + element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
|
---|
| 198 | + element->NodalFunctions(basis,gauss);
|
---|
| 199 | +
|
---|
| 200 | + D=gauss->weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel/(heatcapacity*rho_ice);
|
---|
| 201 | + if(reCast<bool,IssmDouble>(dt)) D=dt*D;
|
---|
| 202 | + TripleMultiply(basis,numnodes,1,0,
|
---|
| 203 | + &D,1,1,0,
|
---|
| 204 | + basis,1,numnodes,0,
|
---|
| 205 | + &Ke->values[0],1);
|
---|
| 206 | +
|
---|
| 207 | + }
|
---|
| 208 | +
|
---|
| 209 | + /*Clean up and return*/
|
---|
| 210 | + delete gauss;
|
---|
| 211 | + xDelete<IssmDouble>(basis);
|
---|
| 212 | + xDelete<IssmDouble>(xyz_list_base);
|
---|
| 213 | + return Ke;
|
---|
| 214 | +}/*}}}*/
|
---|
| 215 | ElementVector* ThermalAnalysis::CreatePVector(Element* element){/*{{{*/
|
---|
| 216 |
|
---|
| 217 | /*compute all load vectors for this element*/
|
---|
| 218 | @@ -262,6 +445,93 @@
|
---|
| 219 | void ThermalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
|
---|
| 220 | element->GetSolutionFromInputsOneDof(solution,TemperatureEnum);
|
---|
| 221 | }/*}}}*/
|
---|
| 222 | +void ThermalAnalysis::GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
|
---|
| 223 | + /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1.
|
---|
| 224 | + * For node i, Bi' can be expressed in the actual coordinate system
|
---|
| 225 | + * by:
|
---|
| 226 | + * Bi_conduct=[ dh/dx ]
|
---|
| 227 | + * [ dh/dy ]
|
---|
| 228 | + * [ dh/dz ]
|
---|
| 229 | + * where h is the interpolation function for node i.
|
---|
| 230 | + *
|
---|
| 231 | + * We assume B has been allocated already, of size: 3x(NDOF1*numnodes)
|
---|
| 232 | + */
|
---|
| 233 | +
|
---|
| 234 | + /*Fetch number of nodes for this finite element*/
|
---|
| 235 | + int numnodes = element->GetNumberOfNodes();
|
---|
| 236 | +
|
---|
| 237 | + /*Get nodal functions derivatives*/
|
---|
| 238 | + IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
|
---|
| 239 | + element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
|
---|
| 240 | +
|
---|
| 241 | + /*Build B: */
|
---|
| 242 | + for(int i=0;i<numnodes;i++){
|
---|
| 243 | + B[numnodes*0+i] = dbasis[0*numnodes+i];
|
---|
| 244 | + B[numnodes*1+i] = dbasis[1*numnodes+i];
|
---|
| 245 | + B[numnodes*2+i] = dbasis[2*numnodes+i];
|
---|
| 246 | + }
|
---|
| 247 | +
|
---|
| 248 | + /*Clean-up*/
|
---|
| 249 | + xDelete<IssmDouble>(dbasis);
|
---|
| 250 | +}/*}}}*/
|
---|
| 251 | +void ThermalAnalysis::GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
|
---|
| 252 | + /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1.
|
---|
| 253 | + * For node i, Bi' can be expressed in the actual coordinate system
|
---|
| 254 | + * by:
|
---|
| 255 | + * Bi_advec =[ h ]
|
---|
| 256 | + * [ h ]
|
---|
| 257 | + * [ h ]
|
---|
| 258 | + * where h is the interpolation function for node i.
|
---|
| 259 | + *
|
---|
| 260 | + * We assume B has been allocated already, of size: 3x(NDOF1*NUMNODESP1)
|
---|
| 261 | + */
|
---|
| 262 | +
|
---|
| 263 | + /*Fetch number of nodes for this finite element*/
|
---|
| 264 | + int numnodes = element->GetNumberOfNodes();
|
---|
| 265 | +
|
---|
| 266 | + /*Get nodal functions*/
|
---|
| 267 | + IssmDouble* basis=xNew<IssmDouble>(numnodes);
|
---|
| 268 | + element->NodalFunctions(basis,gauss);
|
---|
| 269 | +
|
---|
| 270 | + /*Build B: */
|
---|
| 271 | + for(int i=0;i<numnodes;i++){
|
---|
| 272 | + B[numnodes*0+i] = basis[i];
|
---|
| 273 | + B[numnodes*1+i] = basis[i];
|
---|
| 274 | + B[numnodes*2+i] = basis[i];
|
---|
| 275 | + }
|
---|
| 276 | +
|
---|
| 277 | + /*Clean-up*/
|
---|
| 278 | + xDelete<IssmDouble>(basis);
|
---|
| 279 | +}/*}}}*/
|
---|
| 280 | +void ThermalAnalysis::GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
|
---|
| 281 | + /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1.
|
---|
| 282 | + * For node i, Bi' can be expressed in the actual coordinate system
|
---|
| 283 | + * by:
|
---|
| 284 | + * Biprime_advec=[ dh/dx ]
|
---|
| 285 | + * [ dh/dy ]
|
---|
| 286 | + * [ dh/dz ]
|
---|
| 287 | + * where h is the interpolation function for node i.
|
---|
| 288 | + *
|
---|
| 289 | + * We assume B has been allocated already, of size: 3x(NDOF1*numnodes)
|
---|
| 290 | + */
|
---|
| 291 | +
|
---|
| 292 | + /*Fetch number of nodes for this finite element*/
|
---|
| 293 | + int numnodes = element->GetNumberOfNodes();
|
---|
| 294 | +
|
---|
| 295 | + /*Get nodal functions derivatives*/
|
---|
| 296 | + IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
|
---|
| 297 | + element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
|
---|
| 298 | +
|
---|
| 299 | + /*Build B: */
|
---|
| 300 | + for(int i=0;i<numnodes;i++){
|
---|
| 301 | + B[numnodes*0+i] = dbasis[0*numnodes+i];
|
---|
| 302 | + B[numnodes*1+i] = dbasis[1*numnodes+i];
|
---|
| 303 | + B[numnodes*2+i] = dbasis[2*numnodes+i];
|
---|
| 304 | + }
|
---|
| 305 | +
|
---|
| 306 | + /*Clean-up*/
|
---|
| 307 | + xDelete<IssmDouble>(dbasis);
|
---|
| 308 | +}/*}}}*/
|
---|
| 309 | void ThermalAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/
|
---|
| 310 |
|
---|
| 311 | bool converged;
|
---|
| 312 | Index: ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp
|
---|
| 313 | ===================================================================
|
---|
| 314 | --- ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp (revision 16839)
|
---|
| 315 | +++ ../trunk-jpl/src/c/analyses/MeltingAnalysis.cpp (revision 16840)
|
---|
| 316 | @@ -72,7 +72,48 @@
|
---|
| 317 |
|
---|
| 318 | /*Finite Element Analysis*/
|
---|
| 319 | ElementMatrix* MeltingAnalysis::CreateKMatrix(Element* element){/*{{{*/
|
---|
| 320 | - _error_("not implemented yet");
|
---|
| 321 | +
|
---|
| 322 | + /*Get basal element*/
|
---|
| 323 | + if(!element->IsOnBed()) return NULL;
|
---|
| 324 | + Element* basalelement = element->SpawnBasalElement();
|
---|
| 325 | +
|
---|
| 326 | + /*Intermediaries */
|
---|
| 327 | + IssmDouble D,Jdet;
|
---|
| 328 | + IssmDouble *xyz_list = NULL;
|
---|
| 329 | +
|
---|
| 330 | + /*Fetch number of nodes and dof for this finite element*/
|
---|
| 331 | + int numnodes = basalelement->GetNumberOfNodes();
|
---|
| 332 | +
|
---|
| 333 | + /*Initialize Element vector*/
|
---|
| 334 | + ElementMatrix* Ke = basalelement->NewElementMatrix(NoneApproximationEnum);
|
---|
| 335 | + IssmDouble* basis = xNew<IssmDouble>(numnodes);
|
---|
| 336 | +
|
---|
| 337 | + /*Retrieve all inputs and parameters*/
|
---|
| 338 | + basalelement->GetVerticesCoordinates(&xyz_list);
|
---|
| 339 | + IssmDouble latentheat = element->GetMaterialParameter(MaterialsLatentheatEnum);
|
---|
| 340 | + IssmDouble heatcapacity = element->GetMaterialParameter(MaterialsHeatcapacityEnum);
|
---|
| 341 | +
|
---|
| 342 | + /* Start looping on the number of gaussian points: */
|
---|
| 343 | + Gauss* gauss=basalelement->NewGauss(2);
|
---|
| 344 | + for(int ig=gauss->begin();ig<gauss->end();ig++){
|
---|
| 345 | + gauss->GaussPoint(ig);
|
---|
| 346 | +
|
---|
| 347 | + basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
|
---|
| 348 | + basalelement->NodalFunctions(basis,gauss);
|
---|
| 349 | + D=latentheat/heatcapacity*gauss->weight*Jdet;
|
---|
| 350 | +
|
---|
| 351 | + TripleMultiply(basis,1,numnodes,1,
|
---|
| 352 | + &D,1,1,0,
|
---|
| 353 | + basis,1,numnodes,0,
|
---|
| 354 | + &Ke->values[0],1);
|
---|
| 355 | + }
|
---|
| 356 | +
|
---|
| 357 | + /*Clean up and return*/
|
---|
| 358 | + xDelete<IssmDouble>(xyz_list);
|
---|
| 359 | + xDelete<IssmDouble>(basis);
|
---|
| 360 | + delete gauss;
|
---|
| 361 | + basalelement->DeleteMaterials(); delete basalelement;
|
---|
| 362 | + return Ke;
|
---|
| 363 | }/*}}}*/
|
---|
| 364 | ElementVector* MeltingAnalysis::CreatePVector(Element* element){/*{{{*/
|
---|
| 365 | return NULL;
|
---|
| 366 | Index: ../trunk-jpl/src/c/classes/Elements/Element.h
|
---|
| 367 | ===================================================================
|
---|
| 368 | --- ../trunk-jpl/src/c/classes/Elements/Element.h (revision 16839)
|
---|
| 369 | +++ ../trunk-jpl/src/c/classes/Elements/Element.h (revision 16840)
|
---|
| 370 | @@ -48,6 +48,7 @@
|
---|
| 371 | virtual ElementVector* CreatePVector(void)=0;
|
---|
| 372 | virtual void CreateJacobianMatrix(Matrix<IssmDouble>* Jff)=0;
|
---|
| 373 | virtual void DeleteMaterials(void)=0;
|
---|
| 374 | + virtual void ElementSizes(IssmDouble* phx,IssmDouble* phy,IssmDouble* phz)=0;
|
---|
| 375 | virtual void EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure)=0;
|
---|
| 376 | virtual IssmDouble EnthalpyDiffusionParameter(IssmDouble enthalpy,IssmDouble pressure)=0;
|
---|
| 377 | virtual IssmDouble EnthalpyDiffusionParameterVolume(int numvertices,IssmDouble* enthalpy,IssmDouble* pressure)=0;
|
---|
| 378 | Index: ../trunk-jpl/src/c/classes/Elements/Tria.h
|
---|
| 379 | ===================================================================
|
---|
| 380 | --- ../trunk-jpl/src/c/classes/Elements/Tria.h (revision 16839)
|
---|
| 381 | +++ ../trunk-jpl/src/c/classes/Elements/Tria.h (revision 16840)
|
---|
| 382 | @@ -78,6 +78,7 @@
|
---|
| 383 | void CreateJacobianMatrix(Matrix<IssmDouble>* Jff);
|
---|
| 384 | void DeleteMaterials(void);
|
---|
| 385 | void Delta18oParameterization(void);
|
---|
| 386 | + void ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){_error_("not implemented yet");};
|
---|
| 387 | void EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){_error_("not implemented yet");};
|
---|
| 388 | void FindParam(int* pvalue,int paramenum);
|
---|
| 389 | void FindParam(IssmDouble* pvalue,int paramenum);
|
---|
| 390 | Index: ../trunk-jpl/src/c/classes/Elements/Penta.cpp
|
---|
| 391 | ===================================================================
|
---|
| 392 | --- ../trunk-jpl/src/c/classes/Elements/Penta.cpp (revision 16839)
|
---|
| 393 | +++ ../trunk-jpl/src/c/classes/Elements/Penta.cpp (revision 16840)
|
---|
| 394 | @@ -1209,8 +1209,8 @@
|
---|
| 395 | return this->element_type;
|
---|
| 396 | }
|
---|
| 397 | /*}}}*/
|
---|
| 398 | -/*FUNCTION Penta::GetElementSizes{{{*/
|
---|
| 399 | -void Penta::GetElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){
|
---|
| 400 | +/*FUNCTION Penta::ElementSizes{{{*/
|
---|
| 401 | +void Penta::ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){
|
---|
| 402 |
|
---|
| 403 | IssmDouble xyz_list[NUMVERTICES][3];
|
---|
| 404 | IssmDouble xmin,ymin,zmin;
|
---|
| 405 | @@ -3980,7 +3980,7 @@
|
---|
| 406 | /*Artificial diffusivity*/
|
---|
| 407 | if(stabilization==1){
|
---|
| 408 | /*Build K: */
|
---|
| 409 | - GetElementSizes(&hx,&hy,&hz);
|
---|
| 410 | + ElementSizes(&hx,&hy,&hz);
|
---|
| 411 | vel=sqrt(vx*vx + vy*vy + vz*vz)+1.e-14;
|
---|
| 412 | h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) + pow(hz*vz/vel,2));
|
---|
| 413 |
|
---|
| 414 | @@ -4209,7 +4209,7 @@
|
---|
| 415 | /*Artifficial diffusivity*/
|
---|
| 416 | if(stabilization==1){
|
---|
| 417 | /*Build K: */
|
---|
| 418 | - GetElementSizes(&hx,&hy,&hz);
|
---|
| 419 | + ElementSizes(&hx,&hy,&hz);
|
---|
| 420 | vel=sqrt(vx*vx + vy*vy + vz*vz)+1.e-14;
|
---|
| 421 | h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) + pow(hz*vz/vel,2));
|
---|
| 422 |
|
---|
| 423 | Index: ../trunk-jpl/src/c/classes/Elements/Penta.h
|
---|
| 424 | ===================================================================
|
---|
| 425 | --- ../trunk-jpl/src/c/classes/Elements/Penta.h (revision 16839)
|
---|
| 426 | +++ ../trunk-jpl/src/c/classes/Elements/Penta.h (revision 16840)
|
---|
| 427 | @@ -74,6 +74,7 @@
|
---|
| 428 | void ComputeStressTensor();
|
---|
| 429 | void Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters);
|
---|
| 430 | void DeleteMaterials(void){_error_("not implemented yet");};
|
---|
| 431 | + void ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
|
---|
| 432 | void FindParam(int* pvalue,int paramenum);
|
---|
| 433 | void FindParam(IssmDouble* pvalue,int paramenum);
|
---|
| 434 | int FiniteElement(void);
|
---|
| 435 | @@ -220,7 +221,6 @@
|
---|
| 436 | void GetGroundedPart(int* point1,IssmDouble* fraction1, IssmDouble* fraction2,bool* mainlyfloating);
|
---|
| 437 | IssmDouble GetGroundedPortion(IssmDouble* xyz_list);
|
---|
| 438 | int GetElementType(void);
|
---|
| 439 | - void GetElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
|
---|
| 440 | Input* GetInput(int inputenum);
|
---|
| 441 | void GetInputListOnVertices(IssmDouble* pvalue,int enumtype);
|
---|
| 442 | void GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
|
---|
| 443 | Index: ../trunk-jpl/src/c/classes/Elements/Seg.h
|
---|
| 444 | ===================================================================
|
---|
| 445 | --- ../trunk-jpl/src/c/classes/Elements/Seg.h (revision 16839)
|
---|
| 446 | +++ ../trunk-jpl/src/c/classes/Elements/Seg.h (revision 16840)
|
---|
| 447 | @@ -83,6 +83,7 @@
|
---|
| 448 | ElementVector* CreatePVectorL2Projection(void);
|
---|
| 449 | void CreateJacobianMatrix(Matrix<IssmDouble>* Jff){_error_("not implemented yet");};
|
---|
| 450 | void Delta18oParameterization(void){_error_("not implemented yet");};
|
---|
| 451 | + void ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){_error_("not implemented yet");};
|
---|
| 452 | void EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){_error_("not implemented yet");};
|
---|
| 453 | IssmDouble EnthalpyDiffusionParameter(IssmDouble enthalpy,IssmDouble pressure){_error_("not implemented");};
|
---|
| 454 | IssmDouble EnthalpyDiffusionParameterVolume(int numvertices,IssmDouble* enthalpy,IssmDouble* pressure){_error_("not implemented");};
|
---|