Changeset 24429
- Timestamp:
- 12/04/19 14:52:35 (5 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
r24335 r24429 116 116 117 117 /*Initialize Element vector and other vectors*/ 118 ElementMatrix* Ke = workelement->NewElementMatrix(); 119 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); 120 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); 121 IssmDouble* dlsf = xNew<IssmDouble>(dim); 122 IssmDouble* normal = xNew<IssmDouble>(dim); 123 IssmDouble* D = xNewZeroInit<IssmDouble>(dim*dim); 118 ElementMatrix *Ke = workelement->NewElementMatrix(); 119 IssmDouble *basis = xNew<IssmDouble>(numnodes); 120 IssmDouble *dbasis = xNew<IssmDouble>(dim*numnodes); 121 IssmDouble dlsf[3]; 122 IssmDouble normal[3]; 124 123 125 124 /*Retrieve all inputs and parameters*/ … … 143 142 144 143 workelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 145 GetB(B,workelement,xyz_list,gauss,dim);146 GetBprime(Bprime,workelement,xyz_list,gauss,dim);144 workelement->NodalFunctions(basis,gauss); 145 workelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 147 146 148 147 D_scalar=gauss->weight*Jdet; 149 148 150 149 if(extrapolatebydiffusion){ 151 152 /* diffuse values outward only along the xy-plane*/ 153 for(int i=0;i<2;i++) D[i*dim+i] = D_scalar; 154 155 TripleMultiply(Bprime,dim,numnodes,1, 156 D,dim,dim,0, 157 Bprime,dim,numnodes,0, 158 &Ke->values[0],1); 150 for(int i=0;i<numnodes;i++){ 151 for(int j=0;j<numnodes;j++){ 152 Ke->values[i*numnodes+j] += D_scalar*(dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]); 153 } 154 } 159 155 } 160 156 else{ … … 175 171 for(i=0;i<dim;i++) normal[i]=0.; 176 172 177 for(row=0;row<dim;row++) 178 for(col=0;col<dim;col++) 179 if(row==col) 180 D[row*dim+col]=D_scalar*normal[row]; 181 else 182 D[row*dim+col]=0.; 183 TripleMultiply(B,dim,numnodes,1, 184 D,dim,dim,0, 185 Bprime,dim,numnodes,0, 186 &Ke->values[0],1); 173 for(int i=0;i<numnodes;i++){ 174 for(int j=0;j<numnodes;j++){ 175 Ke->values[i*numnodes+j] += D_scalar*(normal[0]*dbasis[0*numnodes+j]*basis[i] + normal[1]*dbasis[1*numnodes+j]*basis[i]); 176 } 177 } 187 178 188 179 /* stabilization */ … … 195 186 h=sqrt(pow(hx*normal[0],2) + pow(hy*normal[1],2)); 196 187 kappa=h/2.+1.e-14; 197 for(row=0;row<dim;row++) 198 for(col=0;col<dim;col++) 199 if(row==col) 200 D[row*dim+col]=D_scalar*kappa; 201 else 202 D[row*dim+col]=0.; 203 TripleMultiply(Bprime,dim,numnodes,1, 204 D,dim,dim,0, 205 Bprime,dim,numnodes,0, 206 &Ke->values[0],1); 188 189 for(int i=0;i<numnodes;i++){ 190 for(int j=0;j<numnodes;j++){ 191 Ke->values[i*numnodes+j] += D_scalar*kappa*(dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]); 192 } 193 } 207 194 } 208 195 } … … 211 198 /*Clean up and return*/ 212 199 xDelete<IssmDouble>(xyz_list); 213 xDelete<IssmDouble>(B); 214 xDelete<IssmDouble>(Bprime); 215 xDelete<IssmDouble>(D); 216 xDelete<IssmDouble>(dlsf); 217 xDelete<IssmDouble>(normal); 200 xDelete<IssmDouble>(basis); 201 xDelete<IssmDouble>(dbasis); 218 202 delete gauss; 219 203 if(extrapolationcase==0){workelement->DeleteMaterials(); delete workelement;}; -
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r24373 r24429 521 521 basalelement->ElementSizes(&hx,&hy,&hz); 522 522 h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) ); 523 IssmDouble D[9]; 524 for(row=0;row<dim;row++) 525 for(col=0;col<dim;col++) 526 D[row*dim+col] = D_scalar*h/(2.*vel)*w[row]*w[col]; 527 GetBprime(Bprime,basalelement,xyz_list,gauss); 528 529 TripleMultiply(Bprime,dim,numnodes,1, 530 &D[0],dim,dim,0, 531 Bprime,dim,numnodes,0, 532 &Ke->values[0],1); 523 for(int i=0;i<numnodes;i++){ 524 for(int j=0;j<numnodes;j++){ 525 Ke->values[i*numnodes+j] += D_scalar*h/(2.*vel)*w[i]*(w[j]*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + w[j]*dbasis[1*numnodes+j]*dbasis[1*numnodes+i]); 526 } 527 } 533 528 } 534 529 break; … … 595 590 596 591 return pe; 597 }/*}}}*/598 void LevelsetAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/599 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.600 * For node i, Bi can be expressed in the actual coordinate system601 * by:602 * Bi=[ N ]603 * [ N ]604 * where N is the finiteelement function for node i.605 *606 * We assume B_prog has been allocated already, of size: 2x(NDOF1*numnodes)607 */608 609 /*Fetch number of nodes for this finite element*/610 int numnodes = element->GetNumberOfNodes();611 612 /*Get nodal functions*/613 IssmDouble* basis=xNew<IssmDouble>(numnodes);614 element->NodalFunctions(basis,gauss);615 616 /*Build B: */617 for(int i=0;i<numnodes;i++){618 B[numnodes*0+i] = basis[i];619 B[numnodes*1+i] = basis[i];620 }621 622 /*Clean-up*/623 xDelete<IssmDouble>(basis);624 }/*}}}*/625 void LevelsetAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/626 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2.627 * For node i, Bi' can be expressed in the actual coordinate system628 * by:629 * Bi_prime=[ dN/dx ]630 * [ dN/dy ]631 * where N is the finiteelement function for node i.632 *633 * We assume B' has been allocated already, of size: 3x(NDOF2*numnodes)634 */635 636 /*Fetch number of nodes for this finite element*/637 int numnodes = element->GetNumberOfNodes();638 639 /*Get nodal functions derivatives*/640 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);641 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);642 643 /*Build B': */644 for(int i=0;i<numnodes;i++){645 Bprime[numnodes*0+i] = dbasis[0*numnodes+i];646 Bprime[numnodes*1+i] = dbasis[1*numnodes+i];647 }648 649 /*Clean-up*/650 xDelete<IssmDouble>(dbasis);651 652 592 }/*}}}*/ 653 593 IssmDouble LevelsetAnalysis::GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.h
r24335 r24429 26 26 ElementMatrix* CreateKMatrix(Element* element); 27 27 ElementVector* CreatePVector(Element* element); 28 void GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);29 void GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss);30 28 IssmDouble GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1); 31 29 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); -
issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
r24374 r24429 425 425 if(stabilization==2){ 426 426 /*Streamline upwind*/ 427 _assert_(dim==2); 427 428 for(int i=0;i<numnodes;i++){ 428 429 for(int j=0;j<numnodes;j++){ … … 499 500 ElementMatrix* Ke = element->NewElementMatrix(); 500 501 IssmDouble* basis = xNew<IssmDouble>(numnodes); 501 IssmDouble* B = xNew<IssmDouble>(2*numnodes); 502 IssmDouble* Bprime = xNew<IssmDouble>(2*numnodes); 503 IssmDouble D[2][2]; 502 IssmDouble* dbasis = xNew<IssmDouble>(3*numnodes); 504 503 505 504 /*Retrieve all inputs and parameters*/ … … 517 516 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 518 517 element->NodalFunctions(basis,gauss); 518 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 519 519 520 520 vxaverage_input->GetInputValue(&vx,gauss); … … 522 522 523 523 D_scalar=gauss->weight*Jdet; 524 TripleMultiply(basis,1,numnodes,1, 525 &D_scalar,1,1,0, 526 basis,1,numnodes,0, 527 &Ke->values[0],1); 528 529 /*WARNING: B and Bprime are inverted compared to CG*/ 530 GetB(Bprime,element,2,xyz_list,gauss); 531 GetBprime(B,element,2,xyz_list,gauss); 532 524 for(int i=0;i<numnodes;i++){ 525 for(int j=0;j<numnodes;j++){ 526 Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]; 527 } 528 } 529 530 /*WARNING: basis and dbasis are inverted compared to CG*/ 533 531 D_scalar = - dt*gauss->weight*Jdet; 534 D[0][0] = D_scalar*vx; 535 D[0][1] = 0.; 536 D[1][0] = 0.; 537 D[1][1] = D_scalar*vy; 538 TripleMultiply(B,2,numnodes,1, 539 &D[0][0],2,2,0, 540 Bprime,2,numnodes,0, 541 &Ke->values[0],1); 542 532 for(int i=0;i<numnodes;i++){ 533 for(int j=0;j<numnodes;j++){ 534 Ke->values[i*numnodes+j] += D_scalar*(vx*dbasis[0*numnodes+i]*basis[j] + vy*dbasis[1*numnodes+i]*basis[j]); 535 } 536 } 543 537 } 544 538 … … 546 540 xDelete<IssmDouble>(xyz_list); 547 541 xDelete<IssmDouble>(basis); 548 xDelete<IssmDouble>(B); 549 xDelete<IssmDouble>(Bprime); 542 xDelete<IssmDouble>(dbasis); 550 543 delete gauss; 551 544 return Ke; … … 989 982 990 983 /*Intermediaries */ 991 IssmDouble Jdet ;984 IssmDouble Jdet,D_scalar; 992 985 IssmDouble vx,vy; 993 986 IssmDouble* xyz_list = NULL; … … 999 992 /*Initialize Element vector and other vectors*/ 1000 993 ElementMatrix* Ke = element->NewElementMatrix(); 1001 IssmDouble* B = xNew<IssmDouble>(dim*numnodes);1002 IssmDouble* Bprime= xNew<IssmDouble>(dim*numnodes);994 IssmDouble* basis = xNew<IssmDouble>(numnodes); 995 IssmDouble* dbasis = xNew<IssmDouble>(dim*numnodes); 1003 996 IssmDouble* D = xNewZeroInit<IssmDouble>(dim*dim); 1004 997 … … 1014 1007 1015 1008 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 1016 GetB(B,element,dim,xyz_list,gauss);1017 GetBprime(Bprime,element,dim,xyz_list,gauss);1009 element->NodalFunctions(basis,gauss); 1010 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 1018 1011 vxaverage_input->GetInputValue(&vx,gauss); 1019 1012 vyaverage_input->GetInputValue(&vy,gauss); 1020 1013 1021 D[0*dim+0] = -gauss->weight*vx*Jdet; 1022 D[1*dim+1] = -gauss->weight*vy*Jdet; 1023 1024 TripleMultiply(B,dim,numnodes,1, 1025 D,dim,dim,0, 1026 Bprime,dim,numnodes,0, 1027 &Ke->values[0],1); 1028 1014 D_scalar = gauss->weight*Jdet; 1015 for(int i=0;i<numnodes;i++){ 1016 for(int j=0;j<numnodes;j++){ 1017 Ke->values[i*numnodes+j] += -D_scalar*(vx*dbasis[0*numnodes+j]*basis[i] + vy*dbasis[1*numnodes+j]*basis[i]); 1018 } 1019 } 1029 1020 } 1030 1021 1031 1022 /*Clean up and return*/ 1032 1023 xDelete<IssmDouble>(xyz_list); 1033 xDelete<IssmDouble>(B); 1034 xDelete<IssmDouble>(Bprime); 1035 xDelete<IssmDouble>(D); 1024 xDelete<IssmDouble>(basis); 1025 xDelete<IssmDouble>(dbasis); 1036 1026 delete gauss; 1037 1027 return Ke; -
issm/trunk-jpl/src/c/analyses/UzawaPressureAnalysis.cpp
r24335 r24429 124 124 125 125 /*Initialize Element matrix and vectors*/ 126 ElementVector *pe = element->NewElementVector();127 IssmDouble *basis = xNew<IssmDouble>(numnodes);128 IssmDouble * dvx = xNew<IssmDouble>(dim);129 IssmDouble * dvy = xNew<IssmDouble>(dim);130 IssmDouble * dvz = xNew<IssmDouble>(dim);126 ElementVector *pe = element->NewElementVector(); 127 IssmDouble *basis = xNew<IssmDouble>(numnodes); 128 IssmDouble dvx[3]; 129 IssmDouble dvy[3]; 130 IssmDouble dvz[3]; 131 131 132 132 Input2* vx_input=element->GetInput2(VxEnum); _assert_(vx_input); … … 159 159 xDelete<IssmDouble>(xyz_list); 160 160 xDelete<IssmDouble>(basis); 161 xDelete<IssmDouble>(dvx);162 xDelete<IssmDouble>(dvy);163 xDelete<IssmDouble>(dvz);164 161 return pe; 165 162 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.