Changeset 15688
- Timestamp:
- 08/02/13 11:47:37 (12 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r15670 r15688 3268 3268 penta_node_ids[14]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elementtoedgeconnectivity[9*index+8]+1; 3269 3269 break; 3270 case P1P1Enum: case P1P1GLSEnum: case MINIcondensedEnum:3270 case P1P1Enum: case P1P1GLSEnum: 3271 3271 numnodes = 12; 3272 3272 penta_node_ids = xNew<int>(numnodes); … … 3285 3285 penta_node_ids[11]=iomodel->nodecounter+iomodel->numberofvertices+iomodel->elements[6*index+5]; 3286 3286 break; 3287 case MINIEnum: 3287 case MINIEnum: case MINIcondensedEnum: 3288 3288 numnodes = 13; 3289 3289 penta_node_ids = xNew<int>(numnodes); … … 5792 5792 5793 5793 /*Fetch number of nodes and dof for this finite element*/ 5794 int vnumnodes = this->NumberofNodesVelocity Final();5794 int vnumnodes = this->NumberofNodesVelocity(); 5795 5795 int pnumnodes = this->NumberofNodesPressure(); 5796 5796 int vnumdof = vnumnodes*NDOF3; … … 7418 7418 Ke =new ElementMatrix(Ke1,Ke2); 7419 7419 7420 /*Condense if requested*/ 7421 if(this->element_type==MINIcondensedEnum){ 7422 int indices[3]={18,19,20}; 7423 Ke->StaticCondensation(3,&indices[0]); 7424 } 7425 7420 7426 /*clean-up and return*/ 7421 7427 delete Ke1; … … 8441 8447 pe =new ElementVector(pe1,pe2,pe3); 8442 8448 8449 /*Condense if requested*/ 8450 if(this->element_type==MINIcondensedEnum){ 8451 int indices[3]={18,19,20}; 8452 8453 this->element_type=MINIEnum; 8454 ElementMatrix* Ke = CreateKMatrixDiagnosticFS(); 8455 this->element_type=MINIcondensedEnum; 8456 8457 pe->StaticCondensation(Ke,3,&indices[0]); 8458 delete Ke; 8459 } 8460 8443 8461 /*clean-up and return*/ 8444 8462 delete pe1; … … 9250 9268 9251 9269 /*Fetch number of nodes and dof for this finite element*/ 9252 int vnumnodes = this->NumberofNodesVelocity Final();9270 int vnumnodes = this->NumberofNodesVelocity(); 9253 9271 int pnumnodes = this->NumberofNodesPressure(); 9254 9272 int vnumdof = vnumnodes*NDOF3; … … 10099 10117 10100 10118 /*Fetch number of nodes and dof for this finite element*/ 10101 int vnumnodes = this->NumberofNodesVelocity Final();10119 int vnumnodes = this->NumberofNodesVelocity(); 10102 10120 int pnumnodes = this->NumberofNodesPressure(); 10103 10121 int vnumdof = vnumnodes*NDOF3; -
issm/trunk-jpl/src/c/classes/Elements/PentaRef.cpp
r15656 r15688 1929 1929 case P1P1Enum: return NUMNODESP1*2; 1930 1930 case P1P1GLSEnum: return NUMNODESP1*2; 1931 case MINIcondensedEnum: return NUMNODESP1 *2;1931 case MINIcondensedEnum: return NUMNODESP1b+NUMNODESP1; 1932 1932 case MINIEnum: return NUMNODESP1b+NUMNODESP1; 1933 1933 case TaylorHoodEnum: return NUMNODESP2+NUMNODESP1; … … 1968 1968 } 1969 1969 /*}}}*/ 1970 /*FUNCTION PentaRef::NumberofNodesVelocityFinal{{{*/1971 int PentaRef::NumberofNodesVelocityFinal(void){1972 1973 /*When static condensation is applied, the final number of nodes might be different*/1974 1975 switch(this->element_type){1976 case P1P1Enum: return NUMNODESP1;1977 case P1P1GLSEnum: return NUMNODESP1;1978 case MINIcondensedEnum: return NUMNODESP1;1979 case MINIEnum: return NUMNODESP1b;1980 case TaylorHoodEnum: return NUMNODESP2;1981 default: _error_("Element type "<<EnumToStringx(this->element_type)<<" not supported yet");1982 }1983 1984 return -1;1985 }1986 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/PentaRef.h
r15654 r15688 71 71 int NumberofNodes(void); 72 72 int NumberofNodesVelocity(void); 73 int NumberofNodesVelocityFinal(void);74 73 int NumberofNodesPressure(void); 75 74 }; -
issm/trunk-jpl/src/c/classes/FemModel.cpp
r15643 r15688 833 833 834 834 /*intermediary: */ 835 int i ;835 int i,M,N; 836 836 int configuration_type; 837 837 Element *element = NULL; … … 846 846 847 847 /*Display message*/ 848 if(VerboseModule()) _printf0_(" Generating matrices \n");848 if(VerboseModule()) _printf0_(" Generating matrices"); 849 849 850 850 /*retrive parameters: */ … … 877 877 /*Allocate stiffness matrices and load vector*/ 878 878 this->AllocateSystemMatrices(&Kff,&Kfs,&df,&pf); 879 880 /*Display size*/ 881 if(VerboseModule()){ 882 Kff->GetSize(&M,&N); 883 _printf0_(" (Kff stiffness matrix size: "<<M<<" x "<<N<<")\n"); 884 } 879 885 880 886 /*Fill stiffness matrix from elements and loads */ -
issm/trunk-jpl/src/c/classes/matrix/ElementMatrix.cpp
r15654 r15688 372 372 } 373 373 /*}}}*/ 374 /*FUNCTION ElementMatrix::StaticCondensation{{{*/ 375 void ElementMatrix::StaticCondensation(int bsize,int* bindices){ 376 /* 377 * | Kii Kib | | Ui | |Fi| 378 * | Kbi Kbb | | Ub | = |Fb| 379 * 380 * Kii Ui + Kib Ub = Fi 381 * Kbi Ui + Kbb Ub = Fb 382 * 383 * We want to remove Ub from the equation: 384 * 385 * Kii Ui + Kib inv(Kbb) (Fb - Kbi Ui) = Fi 386 * 387 * which gives: 388 * 389 * (Kii - Kib inv(Kbb) Kbi) Ui = Fi - Kib inv(Kbb) Fb 390 */ 391 392 /*Checks in debugging mode*/ 393 _assert_(this->nrows==this->ncols && bsize>0 && bsize<this->ncols && this->values); 394 395 /*Intermediaries*/ 396 int counter,i,j,isize; 397 IssmDouble *Kii = NULL; 398 IssmDouble *Kib = NULL; 399 IssmDouble *Kbi = NULL; 400 IssmDouble *Kbb = NULL; 401 IssmDouble *Kbbinv = NULL; 402 IssmDouble *Ktemp = NULL; 403 int *iindices = NULL; 404 bool flag; 405 406 /*Get new sizes and indices*/ 407 isize = this->nrows - bsize; 408 iindices = xNew<int>(isize); 409 counter = 0; 410 for(i=0;i<this->nrows;i++){ 411 flag = true; 412 for(j=0;j<bsize;j++){ 413 if(i==bindices[j]){ 414 flag = false; 415 break; 416 } 417 } 418 if(flag){ 419 _assert_(counter<isize); 420 iindices[counter++] = i; 421 } 422 } 423 _assert_(counter == isize); 424 425 /*Get submatrices*/ 426 Kii = xNew<IssmDouble>(isize*isize); 427 Kib = xNew<IssmDouble>(isize*bsize); 428 Kbi = xNew<IssmDouble>(bsize*isize); 429 Kbb = xNew<IssmDouble>(bsize*bsize); 430 for(i=0;i<isize;i++) for(j=0;j<isize;j++) Kii[i*isize+j] = this->values[iindices[i]*this->ncols + iindices[j]]; 431 for(i=0;i<isize;i++) for(j=0;j<bsize;j++) Kib[i*bsize+j] = this->values[iindices[i]*this->ncols + bindices[j]]; 432 for(i=0;i<bsize;i++) for(j=0;j<isize;j++) Kbi[i*isize+j] = this->values[bindices[i]*this->ncols + iindices[j]]; 433 for(i=0;i<bsize;i++) for(j=0;j<bsize;j++) Kbb[i*bsize+j] = this->values[bindices[i]*this->ncols + bindices[j]]; 434 435 /*Invert Kbb*/ 436 Kbbinv = xNew<IssmDouble>(bsize*bsize); 437 switch(bsize){ 438 case 1: 439 Kbbinv[0] = 1./Kbb[0]; 440 break; 441 case 2: 442 Matrix2x2Invert(Kbbinv,Kbb); 443 break; 444 case 3: 445 Matrix3x3Invert(Kbbinv,Kbb); 446 break; 447 default: 448 MatrixInverse(Kbbinv,bsize,bsize,NULL,0,NULL); 449 break; 450 } 451 452 /*Calculate Kib inv(Kbb) Kbi*/ 453 Ktemp = xNew<IssmDouble>(isize*isize); 454 TripleMultiply(Kib,isize,bsize,0, Kbbinv,bsize,bsize,0, Kbi,bsize,isize,0, Ktemp,0); 455 456 /*New Ke*/ 457 for(i=0;i<isize*isize;i++) Ktemp[i] = Kii[i] - Ktemp[i]; 458 459 /*Update matrix values*/ 460 for(i=0;i<this->nrows*this->ncols;i++) this->values[i]=0.; 461 for(i=0;i<isize;i++){ 462 for(j=0;j<isize;j++){ 463 this->values[iindices[i]*this->ncols + iindices[j]] = Ktemp[i*isize+j]; 464 } 465 } 466 467 /*Clean up and return*/ 468 xDelete<IssmDouble>(Kii); 469 xDelete<IssmDouble>(Kib); 470 xDelete<IssmDouble>(Kbi); 471 xDelete<IssmDouble>(Kbb); 472 xDelete<IssmDouble>(Kbbinv); 473 xDelete<IssmDouble>(Ktemp); 474 xDelete<int>(iindices); 475 return; 476 } 477 /*}}}*/ 374 478 /*FUNCTION ElementMatrix::Echo{{{*/ 375 479 void ElementMatrix::Echo(void){ -
issm/trunk-jpl/src/c/classes/matrix/ElementMatrix.h
r15067 r15688 10 10 11 11 /*Headers:*/ 12 /*{{{*/13 12 #include "../../datastructures/datastructures.h" 14 13 #include "../../toolkits/toolkits.h" … … 17 16 template <class doublematrix> class Matrix; 18 17 class Parameters; 19 /*}}}*/20 18 21 19 class ElementMatrix{ … … 51 49 int* col_sglobaldoflist; 52 50 53 /*ElementMatrix constructors, destructors {{{*/51 /*ElementMatrix constructors, destructors*/ 54 52 ElementMatrix(); 55 53 ElementMatrix(ElementMatrix* Ke); … … 58 56 ElementMatrix(Node** nodes,int numnodes,Parameters* parameters,int approximation=NoneApproximationEnum); 59 57 ~ElementMatrix(); 60 /*}}}*/ 61 /*ElementMatrix specific routines {{{*/58 59 /*ElementMatrix specific routines*/ 62 60 void AddToGlobal(Matrix<IssmDouble>* Kff, Matrix<IssmDouble>* Kfs); 63 61 void AddToGlobal(Matrix<IssmDouble>* Jff); 64 62 void Echo(void); 65 63 void CheckConsistency(void); 64 void StaticCondensation(int numindices,int* indices); 66 65 void Transpose(void); 67 66 void Init(ElementMatrix* Ke); 68 67 void SetDiag(IssmDouble scalar); 69 /*}}}*/70 68 }; 71 69 #endif //#ifndef _ELEMENT_MATRIX_H_ -
issm/trunk-jpl/src/c/classes/matrix/ElementVector.cpp
r15104 r15688 274 274 } 275 275 /*}}}*/ 276 /*FUNCTION ElementVector::StaticCondensation{{{*/ 277 void ElementVector::StaticCondensation(ElementMatrix* Ke,int bsize,int* bindices){ 278 /* 279 * | Kii Kib | | Ui | |Fi| 280 * | Kbi Kbb | | Ub | = |Fb| 281 * 282 * Kii Ui + Kib Ub = Fi 283 * Kbi Ui + Kbb Ub = Fb 284 * 285 * We want to remove Ub from the equation: 286 * 287 * Kii Ui + Kib inv(Kbb) (Fb - Kbi Ui) = Fi 288 * 289 * which gives: 290 * 291 * (Kii - Kib inv(Kbb) Kbi) Ui = Fi - Kib inv(Kbb) Fb 292 */ 293 294 /*Checks in debugging mode*/ 295 _assert_(bsize>0 && bsize<this->nrows && this->values && Ke); 296 _assert_(Ke->nrows==Ke->ncols && this->nrows==Ke->nrows); 297 298 /*Intermediaries*/ 299 int counter,i,j,isize; 300 IssmDouble *Fb = NULL; 301 IssmDouble *Fi = NULL; 302 IssmDouble *Kib = NULL; 303 IssmDouble *Kbb = NULL; 304 IssmDouble *Kbbinv = NULL; 305 IssmDouble *Ftemp = NULL; 306 int *iindices = NULL; 307 bool flag; 308 309 /*Get new sizes and indices*/ 310 isize = this->nrows - bsize; 311 iindices = xNew<int>(isize); 312 counter = 0; 313 for(i=0;i<this->nrows;i++){ 314 flag = true; 315 for(j=0;j<bsize;j++){ 316 if(i==bindices[j]){ 317 flag = false; 318 break; 319 } 320 } 321 if(flag){ 322 _assert_(counter<isize); 323 iindices[counter++] = i; 324 } 325 } 326 _assert_(counter == isize); 327 328 /*Get submatrices*/ 329 Kib = xNew<IssmDouble>(isize*bsize); 330 Kbb = xNew<IssmDouble>(bsize*bsize); 331 Fb = xNew<IssmDouble>(bsize); 332 Fi = xNew<IssmDouble>(isize); 333 for(i=0;i<isize;i++) for(j=0;j<bsize;j++) Kib[i*bsize+j] = Ke->values[iindices[i]*Ke->ncols + bindices[j]]; 334 for(i=0;i<bsize;i++) for(j=0;j<bsize;j++) Kbb[i*bsize+j] = Ke->values[bindices[i]*Ke->ncols + bindices[j]]; 335 for(i=0;i<bsize;i++) Fb[i] = this->values[bindices[i]]; 336 for(i=0;i<isize;i++) Fi[i] = this->values[iindices[i]]; 337 338 /*Invert Kbb*/ 339 Kbbinv = xNew<IssmDouble>(bsize*bsize); 340 switch(bsize){ 341 case 1: 342 Kbbinv[0] = 1./Kbb[0]; 343 break; 344 case 2: 345 Matrix2x2Invert(Kbbinv,Kbb); 346 break; 347 case 3: 348 Matrix3x3Invert(Kbbinv,Kbb); 349 break; 350 default: 351 MatrixInverse(Kbbinv,bsize,bsize,NULL,0,NULL); 352 break; 353 } 354 355 /*Calculate Kib inv(Kbb) Fb*/ 356 Ftemp = xNew<IssmDouble>(isize); 357 TripleMultiply(Kib,isize,bsize,0, Kbbinv,bsize,bsize,0, Fb,bsize,1,0, Ftemp,0); 358 359 /*New Pe*/ 360 for(i=0;i<isize;i++) Ftemp[i] = Fi[i] - Ftemp[i]; 361 362 /*Update matrix values*/ 363 for(i=0;i<this->nrows;i++) this->values[i]=0.; 364 for(i=0;i<isize;i++){ 365 this->values[iindices[i]] = Ftemp[i]; 366 } 367 368 /*Clean up and return*/ 369 xDelete<IssmDouble>(Kib); 370 xDelete<IssmDouble>(Kbb); 371 xDelete<IssmDouble>(Kbbinv); 372 xDelete<IssmDouble>(Fb); 373 xDelete<IssmDouble>(Fi); 374 xDelete<IssmDouble>(Ftemp); 375 xDelete<int>(iindices); 376 return; 377 } 378 /*}}}*/ -
issm/trunk-jpl/src/c/classes/matrix/ElementVector.h
r15067 r15688 10 10 11 11 /*Headers:*/ 12 /*{{{*/13 12 #include "../../datastructures/datastructures.h" 14 13 #include "../../toolkits/toolkits.h" … … 17 16 template <class doubletype> class Vector; 18 17 class Parameters; 19 /*}}}*/ 18 class ElementMatrix; 20 19 21 20 class ElementVector{ 22 21 23 22 public: 24 25 int nrows; 26 IssmDouble* values; 23 int nrows; 24 IssmDouble* values; 27 25 28 26 //gset 29 int* 27 int* gglobaldoflist; 30 28 31 29 //fset 32 int 33 int* 34 int* 30 int fsize; 31 int* flocaldoflist; 32 int* fglobaldoflist; 35 33 36 /*ElementVector constructors, destructors {{{*/34 /*ElementVector constructors, destructors*/ 37 35 ElementVector(); 38 36 ElementVector(ElementVector* pe1,ElementVector* pe2); … … 40 38 ElementVector(Node** nodes,int numnodes,Parameters* parameters,int approximation=NoneApproximationEnum); 41 39 ~ElementVector(); 42 /*}}}*/ 43 /*ElementVector specific routines {{{*/40 41 /*ElementVector specific routines*/ 44 42 void AddToGlobal(Vector<IssmDouble>* pf); 45 43 void InsertIntoGlobal(Vector<IssmDouble>* pf); … … 48 46 void Init(ElementVector* pe); 49 47 void SetValue(IssmDouble scalar); 50 /*}}}*/48 void StaticCondensation(ElementMatrix* Ke,int numindices,int* indices); 51 49 }; 52 50 #endif //#ifndef _ELEMENT_VECTOR_H_ -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateNodes.cpp
r15658 r15688 130 130 case MINIcondensedEnum: 131 131 _assert_(approximation==FSApproximationEnum); 132 /*P1 velocity (bubble statically condensed)*/ 133 for(i=0;i<iomodel->numberofvertices;i++){ 134 if(iomodel->my_vertices[i]){ 135 nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i,iomodel,analysis,FSvelocityEnum)); 136 } 137 } 138 /*P1 pressure*/ 139 for(i=0;i<iomodel->numberofvertices;i++){ 140 if(iomodel->my_vertices[i]){ 141 nodes->AddObject(new Node(iomodel->nodecounter+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,i,iomodel,analysis,FSpressureEnum)); 132 /*P1+ velocity (bubble statically condensed)*/ 133 for(i=0;i<iomodel->numberofvertices;i++){ 134 if(iomodel->my_vertices[i]){ 135 nodes->AddObject(new Node(iomodel->nodecounter+i+1,i,i,iomodel,analysis,FSvelocityEnum)); 136 } 137 } 138 for(i=0;i<iomodel->numberofelements;i++){ 139 if(iomodel->my_elements[i]){ 140 node = new Node(iomodel->nodecounter+iomodel->numberofvertices+i+1,iomodel->numberofvertices+i,0,iomodel,analysis,FSvelocityEnum); 141 node->Deactivate(); 142 nodes->AddObject(node); 143 } 144 } 145 /*P1 pressure*/ 146 for(i=0;i<iomodel->numberofvertices;i++){ 147 if(iomodel->my_vertices[i]){ 148 nodes->AddObject(new Node(iomodel->nodecounter+iomodel->numberofvertices+iomodel->numberofelements+i+1,iomodel->numberofvertices+iomodel->numberofelements+i,i,iomodel,analysis,FSpressureEnum)); 142 149 } 143 150 } -
issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateConstraintsDiagnosticHoriz.cpp
r15657 r15688 98 98 case 0 : finiteelement = P1Enum; break;//P1P1 99 99 case 1 : finiteelement = P1Enum; break;//P1P1GSL 100 case 2 : finiteelement = P1 Enum;break;//MINIcondensed100 case 2 : finiteelement = P1bubbleEnum; break;//MINIcondensed 101 101 case 3 : finiteelement = P1bubbleEnum; break;//MINI 102 102 case 4 : finiteelement = P2Enum; break;//TaylorHood (P2P1) -
issm/trunk-jpl/src/c/modules/ModelProcessorx/DiagnosticHoriz/CreateNodesDiagnosticHoriz.cpp
r15656 r15688 70 70 } 71 71 } 72 73 72 iomodel->FetchData(9,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,FlowequationBorderSSAEnum,FlowequationBorderFSEnum, 74 73 MaskVertexongroundediceEnum,MaskVertexonfloatingiceEnum,MaskVertexonwaterEnum,FlowequationVertexEquationEnum,DiagnosticReferentialEnum); -
issm/trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp
r15104 r15688 21 21 int idima,idimb,idimc,idimd; 22 22 IssmDouble *dtemp; 23 _assert_(a && b && c && d); 23 24 24 25 /* set up dimensions for triple product */ 25 26 26 if (!itrna){ 27 27 idima=nrowa; … … 83 83 int i,j,k,ipta,iptb,iptc; 84 84 int nrowc,ncolc,iinca,jinca,iincb,jincb,ntrma,ntrmb,nterm; 85 86 _assert_(a && b && c); 85 87 86 88 /* set up dimensions and increments for matrix a */ … … 326 328 /*Compute determinant*/ 327 329 Matrix2x2Determinant(&det,A); 328 if (fabs(det) < DBL_EPSILON) _error_("Determinant smaller tha tmachine epsilon");330 if (fabs(det) < DBL_EPSILON) _error_("Determinant smaller than machine epsilon"); 329 331 330 332 /*Compute invert*/ … … 351 353 /*Compute determinant*/ 352 354 Matrix3x3Determinant(&det,A); 353 if (fabs(det) < DBL_EPSILON) _error_("Determinant smaller tha tmachine epsilon");355 if (fabs(det) < DBL_EPSILON) _error_("Determinant smaller than machine epsilon"); 354 356 355 357 /*Compute invert*/
Note:
See TracChangeset
for help on using the changeset viewer.