Changeset 25261
- Timestamp:
- 07/10/20 20:29:59 (5 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/MeltingAnalysis.cpp
r25118 r25261 109 109 D=latentheat/heatcapacity*gauss->weight*Jdet; 110 110 111 TripleMultiply(basis,1,numnodes,1, 112 &D,1,1,0, 113 basis,1,numnodes,0, 114 &Ke->values[0],1); 111 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D*basis[i]*basis[j]; 115 112 } 116 113 -
issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp
r25118 r25261 362 362 D=gauss->weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel/(heatcapacity*rho_ice); 363 363 if(reCast<bool,IssmDouble>(dt)) D=dt*D; 364 TripleMultiply(basis,numnodes,1,0, 365 &D,1,1,0, 366 basis,1,numnodes,0, 367 &Ke->values[0],1); 368 364 for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D*basis[i]*basis[j]; 369 365 } 370 366 … … 395 391 IssmDouble* basis = xNew<IssmDouble>(numnodes); 396 392 IssmDouble* dbasis = xNew<IssmDouble>(3*numnodes); 397 IssmDouble* Bprime = xNew<IssmDouble>(3*numnodes);398 393 IssmDouble K[3][3]; 399 394 … … 468 463 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); 469 464 for(int i=0;i<3;i++) for(int j=0;j<3;j++) K[i][j] = D_scalar*K[i][j]; 470 GetBAdvecprime(Bprime,element,xyz_list,gauss); 471 472 TripleMultiply(Bprime,3,numnodes,1, 473 &K[0][0],3,3,0, 474 Bprime,3,numnodes,0, 475 &Ke->values[0],1); 465 466 for(int i=0;i<numnodes;i++){ 467 for(int j=0;j<numnodes;j++){ 468 Ke->values[i*numnodes+j] += ( 469 dbasis[0*numnodes+i] *(K[0][0]*dbasis[0*numnodes+j] + K[0][1]*dbasis[1*numnodes+j]+ K[0][2]*dbasis[2*numnodes+j]) + 470 dbasis[1*numnodes+i] *(K[1][0]*dbasis[0*numnodes+j] + K[1][1]*dbasis[1*numnodes+j]+ K[1][2]*dbasis[2*numnodes+j]) + 471 dbasis[2*numnodes+i] *(K[2][0]*dbasis[0*numnodes+j] + K[2][1]*dbasis[1*numnodes+j]+ K[2][2]*dbasis[2*numnodes+j]) 472 ); 473 } 474 } 476 475 } 477 476 else if(stabilization==2){ … … 513 512 /*Clean up and return*/ 514 513 xDelete<IssmDouble>(xyz_list); 515 xDelete<IssmDouble>(Bprime);516 514 xDelete<IssmDouble>(basis); 517 515 xDelete<IssmDouble>(dbasis); … … 744 742 return pe; 745 743 746 }/*}}}*/747 void ThermalAnalysis::GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/748 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*1.749 * For node i, Bi' can be expressed in the actual coordinate system750 * by:751 * Bi_advec =[ h ]752 * [ h ]753 * [ h ]754 * where h is the interpolation function for node i.755 *756 * We assume B has been allocated already, of size: 3x(1*NUMNODESP1)757 */758 759 /*Fetch number of nodes for this finite element*/760 int numnodes = element->GetNumberOfNodes();761 762 /*Get nodal functions*/763 IssmDouble* basis=xNew<IssmDouble>(numnodes);764 element->NodalFunctions(basis,gauss);765 766 /*Build B: */767 for(int i=0;i<numnodes;i++){768 B[numnodes*0+i] = basis[i];769 B[numnodes*1+i] = basis[i];770 B[numnodes*2+i] = basis[i];771 }772 773 /*Clean-up*/774 xDelete<IssmDouble>(basis);775 }/*}}}*/776 void ThermalAnalysis::GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/777 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*1.778 * For node i, Bi' can be expressed in the actual coordinate system779 * by:780 * Biprime_advec=[ dh/dx ]781 * [ dh/dy ]782 * [ dh/dz ]783 * where h is the interpolation function for node i.784 *785 * We assume B has been allocated already, of size: 3x(1*numnodes)786 */787 788 /*Fetch number of nodes for this finite element*/789 int numnodes = element->GetNumberOfNodes();790 791 /*Get nodal functions derivatives*/792 IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);793 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);794 795 /*Build B: */796 for(int i=0;i<numnodes;i++){797 B[numnodes*0+i] = dbasis[0*numnodes+i];798 B[numnodes*1+i] = dbasis[1*numnodes+i];799 B[numnodes*2+i] = dbasis[2*numnodes+i];800 }801 802 /*Clean-up*/803 xDelete<IssmDouble>(dbasis);804 }/*}}}*/805 void ThermalAnalysis::GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/806 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*1.807 * For node i, Bi' can be expressed in the actual coordinate system808 * by:809 * Bi_conduct=[ dh/dx ]810 * [ dh/dy ]811 * [ dh/dz ]812 * where h is the interpolation function for node i.813 *814 * We assume B has been allocated already, of size: 3x(1*numnodes)815 */816 817 /*Fetch number of nodes for this finite element*/818 int numnodes = element->GetNumberOfNodes();819 820 /*Get nodal functions derivatives*/821 IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);822 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);823 824 /*Build B: */825 for(int i=0;i<numnodes;i++){826 B[numnodes*0+i] = dbasis[0*numnodes+i];827 B[numnodes*1+i] = dbasis[1*numnodes+i];828 B[numnodes*2+i] = dbasis[2*numnodes+i];829 }830 831 /*Clean-up*/832 xDelete<IssmDouble>(dbasis);833 744 }/*}}}*/ 834 745 void ThermalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ -
issm/trunk-jpl/src/c/analyses/ThermalAnalysis.h
r24335 r25261 31 31 ElementVector* CreatePVectorShelf(Element* element); 32 32 ElementVector* CreatePVectorVolume(Element* element); 33 void GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);34 void GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);35 void GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);36 33 void GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element); 37 34 void GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
Note:
See TracChangeset
for help on using the changeset viewer.