Changeset 16433
- Timestamp:
- 10/16/13 13:34:51 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/classes/Elements
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r16422 r16433 10160 10160 void Penta::InputUpdateFromSolutionStressbalanceSSAFS(IssmDouble* solution){ 10161 10161 10162 const int numdof m=NDOF2*NUMVERTICES;10163 const int numdof s=NDOF3*NUMVERTICES;10164 const int numdof 2d=NDOF2*NUMVERTICES2D;10165 const int numdof pressure=NDOF1*NUMVERTICES;10162 const int numdofSSA = NDOF2*NUMVERTICES; 10163 const int numdof2d = NDOF2*NUMVERTICES2D; 10164 const int numdofFSv = NDOF3*NUMVERTICES; 10165 const int numdofFSp = NDOF1*NUMVERTICES; 10166 10166 10167 10167 int i; 10168 10168 IssmDouble FSreconditioning; 10169 IssmDouble SSA_values[numdofm]; 10170 IssmDouble FS_values[numdofs]; 10171 IssmDouble Pressure_values[numdofs]; 10169 IssmDouble SSA_values[numdofSSA]; 10170 IssmDouble FS_values[numdofFSv+numdofFSp]; 10172 10171 IssmDouble vx[NUMVERTICES]; 10173 10172 IssmDouble vy[NUMVERTICES]; … … 10178 10177 IssmDouble pressure[NUMVERTICES]; 10179 10178 IssmDouble xyz_list[NUMVERTICES][3]; 10180 int* doflistm = NULL; 10181 int* doflists = NULL; 10182 int* doflistpressure = NULL; 10183 Penta *penta = NULL; 10179 int *doflistSSA = NULL; 10180 int *doflistFSv = NULL; 10181 int *doflistFSp = NULL; 10182 Penta *penta = NULL; 10183 10184 /*Prepare coordinate system list*/ 10185 int* cs_list = xNew<int>(2*NUMVERTICES); 10186 for(i=0;i<NUMVERTICES;i++) cs_list[i] = XYZEnum; 10187 for(i=0;i<NUMVERTICES;i++) cs_list[NUMVERTICES+i] = PressureEnum; 10184 10188 10185 10189 /*OK, we have to add results of this element for SSA … … 10188 10192 10189 10193 /*Get dof listof this element (SSA dofs) and of the penta at base (SSA dofs): */ 10190 penta->GetDofList(&doflist m,SSAApproximationEnum,GsetEnum);10191 GetDofList(&doflist s,FSvelocityEnum,GsetEnum);10192 GetDofListPressure(&doflist pressure,GsetEnum);10194 penta->GetDofList(&doflistSSA,SSAApproximationEnum,GsetEnum); 10195 GetDofList(&doflistFSv,FSvelocityEnum,GsetEnum); 10196 GetDofListPressure(&doflistFSp,GsetEnum); 10193 10197 this->parameters->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 10194 10198 … … 10198 10202 /*Use the dof list to index into the solution vector: */ 10199 10203 for(i=0;i<numdof2d;i++){ 10200 SSA_values[i]=solution[doflist m[i]];10201 SSA_values[i+numdof2d]=solution[doflist m[i]];10202 } 10203 for(i=0;i<numdof s;i++)FS_values[i]=solution[doflists[i]];10204 for(i=0;i<numdof pressure;i++) Pressure_values[i]=solution[doflistpressure[i]];10204 SSA_values[i]=solution[doflistSSA[i]]; 10205 SSA_values[i+numdof2d]=solution[doflistSSA[i]]; 10206 } 10207 for(i=0;i<numdofFSv;i++) FS_values[i]=solution[doflistFSv[i]]; 10208 for(i=0;i<numdofFSp;i++) FS_values[numdofFSv+i]=solution[doflistFSp[i]]; 10205 10209 10206 10210 /*Transform solution in Cartesian Space*/ 10207 10211 TransformSolutionCoord(&SSA_values[0],this->nodes,NUMVERTICES,XYEnum); 10208 TransformSolutionCoord(&FS_values[0],this->nodes, NUMVERTICES,XYZEnum);10212 TransformSolutionCoord(&FS_values[0],this->nodes,2*NUMVERTICES,cs_list); 10209 10213 10210 10214 /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ 10211 10215 for(i=0;i<NUMVERTICES;i++){ 10212 vx[i] =FS_values[i*NDOF3+0]+SSA_values[i*NDOF2+0];10213 vy[i] =FS_values[i*NDOF3+1]+SSA_values[i*NDOF2+1];10214 vzFS[i] =FS_values[i*NDOF3+2];10215 pressure[i] =Pressure_values[i*NDOF1]*FSreconditioning;10216 vx[i] = FS_values[i*NDOF3+0]+SSA_values[i*NDOF2+0]; 10217 vy[i] = FS_values[i*NDOF3+1]+SSA_values[i*NDOF2+1]; 10218 vzFS[i] = FS_values[i*NDOF3+2]; 10219 pressure[i] = FS_values[NUMVERTICES*NDOF3+i]*FSreconditioning; 10216 10220 10217 10221 /*Check solution*/ 10218 10222 if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector"); 10219 10223 if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector"); 10220 if(xIsNan<IssmDouble>(vzFS[i])) _error_("NaN found in solution vector");10224 if(xIsNan<IssmDouble>(vzFS[i])) _error_("NaN found in solution vector"); 10221 10225 if(xIsNan<IssmDouble>(pressure[i])) _error_("NaN found in solution vector"); 10222 10226 } … … 10236 10240 /*Now Compute vel*/ 10237 10241 for(i=0;i<NUMVERTICES;i++) { 10238 vz[i] =vzSSA[i]+vzFS[i];10239 vel[i] =pow( pow(vx[i],2.0) + pow(vy[i],2.0) + pow(vz[i],2.0) , 0.5);10242 vz[i] = vzSSA[i]+vzFS[i]; 10243 vel[i] = sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]); 10240 10244 } 10241 10245 … … 10256 10260 10257 10261 /*Free ressources:*/ 10258 xDelete<int>(doflistm); 10259 xDelete<int>(doflists); 10260 xDelete<int>(doflistpressure); 10262 xDelete<int>(doflistSSA); 10263 xDelete<int>(doflistFSv); 10264 xDelete<int>(doflistFSp); 10265 xDelete<int>(cs_list); 10261 10266 } 10262 10267 /*}}}*/ … … 10418 10423 void Penta::InputUpdateFromSolutionStressbalanceHOFS(IssmDouble* solution){ 10419 10424 10420 const int numdof p=NDOF2*NUMVERTICES;10421 const int numdof s=NDOF3*NUMVERTICES;10422 const int numdof pressure=NDOF1*NUMVERTICES;10425 const int numdofHO = NDOF2*NUMVERTICES; 10426 const int numdofFSv = NDOF3*NUMVERTICES; 10427 const int numdofFSp = NDOF1*NUMVERTICES; 10423 10428 10424 10429 int i; 10425 IssmDouble HO_values[numdofp]; 10426 IssmDouble FS_values[numdofs]; 10427 IssmDouble Pressure_values[numdofpressure]; 10430 IssmDouble HO_values[numdofHO]; 10431 IssmDouble FS_values[numdofFSv+numdofFSp]; 10428 10432 IssmDouble vx[NUMVERTICES]; 10429 10433 IssmDouble vy[NUMVERTICES]; … … 10435 10439 IssmDouble xyz_list[NUMVERTICES][3]; 10436 10440 IssmDouble FSreconditioning; 10437 int* doflistp = NULL; 10438 int* doflists = NULL; 10439 int* doflistpressure = NULL; 10441 int* doflistHO = NULL; 10442 int* doflistFSv = NULL; 10443 int* doflistFSp = NULL; 10444 10445 /*Prepare coordinate system list*/ 10446 int* cs_list = xNew<int>(2*NUMVERTICES); 10447 for(i=0;i<NUMVERTICES;i++) cs_list[i] = XYZEnum; 10448 for(i=0;i<NUMVERTICES;i++) cs_list[NUMVERTICES+i] = PressureEnum; 10440 10449 10441 10450 /*Get dof listof this element (HO dofs) and of the penta at base (SSA dofs): */ 10442 GetDofList(&doflist p,HOApproximationEnum,GsetEnum);10443 GetDofList(&doflist s,FSvelocityEnum,GsetEnum);10444 GetDofListPressure(&doflist pressure,GsetEnum);10451 GetDofList(&doflistHO,HOApproximationEnum,GsetEnum); 10452 GetDofList(&doflistFSv,FSvelocityEnum,GsetEnum); 10453 GetDofListPressure(&doflistFSp,GsetEnum); 10445 10454 this->parameters->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum); 10446 10455 … … 10449 10458 10450 10459 /*Use the dof list to index into the solution vector: */ 10451 for(i=0;i<numdof p;i++) HO_values[i]=solution[doflistp[i]];10452 for(i=0;i<numdof s;i++) FS_values[i]=solution[doflists[i]];10453 for(i=0;i<numdof pressure;i++) Pressure_values[i]=solution[doflistpressure[i]];10460 for(i=0;i<numdofHO;i++) HO_values[i]=solution[doflistHO[i]]; 10461 for(i=0;i<numdofFSv;i++) FS_values[i]=solution[doflistFSv[i]]; 10462 for(i=0;i<numdofFSp;i++) FS_values[numdofFSv+i]=solution[doflistFSp[i]]; 10454 10463 10455 10464 /*Transform solution in Cartesian Space*/ 10456 10465 TransformSolutionCoord(&HO_values[0],this->nodes,NUMVERTICES,XYEnum); 10457 TransformSolutionCoord(&FS_values[0],this->nodes, NUMVERTICES,XYZEnum);10466 TransformSolutionCoord(&FS_values[0],this->nodes,2*NUMVERTICES,cs_list); 10458 10467 10459 10468 /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ 10460 10469 for(i=0;i<NUMVERTICES;i++){ 10461 vx[i] =FS_values[i*NDOF3+0]+HO_values[i*NDOF2+0];10462 vy[i] =FS_values[i*NDOF3+1]+HO_values[i*NDOF2+1];10463 vzFS[i] =FS_values[i*NDOF3+2];10464 pressure[i] =Pressure_values[i*NDOF1]*FSreconditioning;10470 vx[i] = FS_values[i*NDOF3+0]+HO_values[i*NDOF2+0]; 10471 vy[i] = FS_values[i*NDOF3+1]+HO_values[i*NDOF2+1]; 10472 vzFS[i] = FS_values[i*NDOF3+2]; 10473 pressure[i] = FS_values[NUMVERTICES*NDOF3+i]*FSreconditioning; 10465 10474 10466 10475 /*Check solution*/ 10467 10476 if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector"); 10468 10477 if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector"); 10469 if(xIsNan<IssmDouble>(vzFS[i])) _error_("NaN found in solution vector");10478 if(xIsNan<IssmDouble>(vzFS[i])) _error_("NaN found in solution vector"); 10470 10479 if(xIsNan<IssmDouble>(pressure[i])) _error_("NaN found in solution vector"); 10471 10480 } … … 10485 10494 /*Now Compute vel*/ 10486 10495 for(i=0;i<NUMVERTICES;i++) { 10487 vz[i] =vzHO[i]+vzFS[i];10488 vel[i] =pow( pow(vx[i],2.0) + pow(vy[i],2.0) + pow(vz[i],2.0) , 0.5);10496 vz[i] = vzHO[i]+vzFS[i]; 10497 vel[i] = sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]); 10489 10498 } 10490 10499 … … 10505 10514 10506 10515 /*Free ressources:*/ 10507 xDelete<int>(doflistp); 10508 xDelete<int>(doflists); 10509 xDelete<int>(doflistpressure); 10516 xDelete<int>(doflistHO); 10517 xDelete<int>(doflistFSv); 10518 xDelete<int>(doflistFSp); 10519 xDelete<int>(cs_list); 10510 10520 } 10511 10521 /*}}}*/ … … 10702 10712 /*Prepare coordinate system list*/ 10703 10713 int* cs_list = xNew<int>(vnumnodes+pnumnodes); 10704 for(i=0;i<vnumnodes;i++) cs_list[i] = XY Enum;10714 for(i=0;i<vnumnodes;i++) cs_list[i] = XYZEnum; 10705 10715 for(i=0;i<pnumnodes;i++) cs_list[vnumnodes+i] = PressureEnum; 10706 10716 -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r16429 r16433 2455 2455 GaussTria* gauss = new GaussTria(); 2456 2456 for(int i=0;i<numindices;i++){//FIXME 2457 2458 2457 2459 2458 gauss->GaussNode(this->VelocityInterpolation(),indices[i]);
Note:
See TracChangeset
for help on using the changeset viewer.