Changeset 17806 for issm/trunk/src/c/analyses/BalancevelocityAnalysis.cpp
- Timestamp:
- 04/22/14 10:39:19 (11 years ago)
- Location:
- issm/trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk
- Property svn:mergeinfo changed
/issm/trunk-jpl merged: 16565-17015,17017-17381,17383-17422,17424-17619,17621-17657,17659-17672,17674-17801,17804
- Property svn:mergeinfo changed
-
issm/trunk/src
- Property svn:mergeinfo changed
-
issm/trunk/src/c
- Property svn:ignore
-
old new 16 16 .deps 17 17 .dirstamp 18 .libs
-
- Property svn:ignore
-
issm/trunk/src/c/analyses
- Property svn:ignore
-
old new 1 *.obj 1 2 .deps 2 3 .dirstamp
-
- Property svn:ignore
-
issm/trunk/src/c/analyses/BalancevelocityAnalysis.cpp
r16542 r17806 6 6 7 7 /*Model processing*/ 8 int BalancevelocityAnalysis::DofsPerNode(int** doflist,int meshtype,int approximation){/*{{{*/8 int BalancevelocityAnalysis::DofsPerNode(int** doflist,int domaintype,int approximation){/*{{{*/ 9 9 return 1; 10 10 }/*}}}*/ … … 25 25 iomodel->FetchDataToInput(elements,ThicknessEnum); 26 26 iomodel->FetchDataToInput(elements,SurfaceEnum); 27 iomodel->FetchDataToInput(elements,B edEnum);27 iomodel->FetchDataToInput(elements,BaseEnum); 28 28 iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum); 29 29 iomodel->FetchDataToInput(elements,VxEnum); … … 33 33 iomodel->FetchDataToInput(elements,BalancethicknessThickeningRateEnum); 34 34 35 if(iomodel-> meshtype==Mesh3DEnum){36 iomodel->FetchDataToInput(elements,MeshElementonb edEnum);35 if(iomodel->domaintype==Domain3DEnum){ 36 iomodel->FetchDataToInput(elements,MeshElementonbaseEnum); 37 37 iomodel->FetchDataToInput(elements,MeshElementonsurfaceEnum); 38 38 } … … 41 41 42 42 /*Check in 3d*/ 43 if(iomodel-> meshtype==Mesh3DEnum) _error_("DG 3d not implemented yet");43 if(iomodel->domaintype==Domain3DEnum) _error_("DG 3d not implemented yet"); 44 44 45 45 /*First fetch data: */ 46 iomodel->FetchData(3,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,FlowequationVertexEquationEnum);47 46 ::CreateNodes(nodes,iomodel,BalancevelocityAnalysisEnum,P1Enum); 48 iomodel->DeleteData(3,MeshVertexonbedEnum,MeshVertexonsurfaceEnum,FlowequationVertexEquationEnum);49 47 }/*}}}*/ 50 48 void BalancevelocityAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/ … … 57 55 /*No loads*/ 58 56 }/*}}}*/ 57 58 /*Finite Element Analysis*/ 59 void BalancevelocityAnalysis::Core(FemModel* femmodel){/*{{{*/ 60 _error_("not implemented"); 61 }/*}}}*/ 62 ElementVector* BalancevelocityAnalysis::CreateDVector(Element* element){/*{{{*/ 63 /*Default, return NULL*/ 64 return NULL; 65 }/*}}}*/ 66 ElementMatrix* BalancevelocityAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/ 67 _error_("Not implemented"); 68 }/*}}}*/ 69 ElementMatrix* BalancevelocityAnalysis::CreateKMatrix(Element* element){/*{{{*/ 70 71 /*Intermediaries */ 72 IssmDouble dhdt,mb,ms,Jdet; 73 IssmDouble h,gamma,thickness; 74 IssmDouble hnx,hny,dhnx[2],dhny[2]; 75 IssmDouble *xyz_list = NULL; 76 77 /*Fetch number of nodes and dof for this finite element*/ 78 int numnodes = element->GetNumberOfNodes(); 79 80 /*Initialize Element matrix and vectors*/ 81 ElementMatrix* Ke = element->NewElementMatrix(); 82 IssmDouble* B = xNew<IssmDouble>(2*numnodes); 83 IssmDouble* basis = xNew<IssmDouble>(numnodes); 84 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes); 85 IssmDouble* HNx = xNew<IssmDouble>(numnodes); 86 IssmDouble* HNy = xNew<IssmDouble>(numnodes); 87 IssmDouble* H = xNew<IssmDouble>(numnodes); 88 IssmDouble* Nx = xNew<IssmDouble>(numnodes); 89 IssmDouble* Ny = xNew<IssmDouble>(numnodes); 90 91 /*Retrieve all Inputs and parameters: */ 92 element->GetVerticesCoordinates(&xyz_list); 93 Input* H_input = element->GetInput(ThicknessEnum); _assert_(H_input); 94 h = element->CharacteristicLength(); 95 96 /*Get vector N for all nodes and build HNx and HNy*/ 97 element->GetInputListOnNodes(Nx,SurfaceSlopeXEnum); 98 element->GetInputListOnNodes(Ny,SurfaceSlopeYEnum); 99 element->GetInputListOnNodes(H,ThicknessEnum); 100 for(int i=0;i<numnodes;i++){ 101 IssmDouble norm=sqrt(Nx[i]*Nx[i]+Ny[i]*Ny[i]+1.e-10); 102 HNx[i] = -H[i]*Nx[i]/norm; 103 HNy[i] = -H[i]*Ny[i]/norm; 104 } 105 106 /*Start looping on the number of gaussian points:*/ 107 Gauss* gauss=element->NewGauss(2); 108 for(int ig=gauss->begin();ig<gauss->end();ig++){ 109 gauss->GaussPoint(ig); 110 111 H_input->GetInputValue(&thickness,gauss); 112 if(thickness<50.) thickness=50.; 113 element->ValueP1DerivativesOnGauss(&dhnx[0],HNx,xyz_list,gauss); 114 element->ValueP1DerivativesOnGauss(&dhny[0],HNy,xyz_list,gauss); 115 element->ValueP1OnGauss(&hnx,HNx,gauss); 116 element->ValueP1OnGauss(&hny,HNy,gauss); 117 118 gamma=h/(2.*thickness+1.e-10); 119 120 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 121 element->NodalFunctions(basis,gauss); 122 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 123 124 for(int i=0;i<numnodes;i++){ 125 for(int j=0;j<numnodes;j++){ 126 Ke->values[i*numnodes+j] += gauss->weight*Jdet*( 127 (basis[i]+gamma*(basis[i]*(dhnx[0]+dhny[1]) + dbasis[0*numnodes+i]*hnx + dbasis[1*numnodes+i]*hny))* 128 (basis[j]*(dhnx[0]+dhny[1]) + dbasis[0*numnodes+j]*hnx + dbasis[1*numnodes+j]*hny) 129 ); 130 } 131 } 132 } 133 134 /*Clean up and return*/ 135 xDelete<IssmDouble>(xyz_list); 136 xDelete<IssmDouble>(basis); 137 xDelete<IssmDouble>(dbasis); 138 xDelete<IssmDouble>(H); 139 xDelete<IssmDouble>(Nx); 140 xDelete<IssmDouble>(Ny); 141 xDelete<IssmDouble>(HNx); 142 xDelete<IssmDouble>(HNy); 143 xDelete<IssmDouble>(B); 144 delete gauss; 145 return Ke; 146 }/*}}}*/ 147 ElementVector* BalancevelocityAnalysis::CreatePVector(Element* element){/*{{{*/ 148 149 /*Intermediaries*/ 150 int domaintype; 151 Element* basalelement; 152 153 /*Get basal element*/ 154 element->FindParam(&domaintype,DomainTypeEnum); 155 switch(domaintype){ 156 case Domain2DhorizontalEnum: 157 basalelement = element; 158 break; 159 case Domain3DEnum: 160 if(!element->IsOnBase()) return NULL; 161 basalelement = element->SpawnBasalElement(); 162 break; 163 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 164 } 165 166 /*Intermediaries */ 167 IssmDouble dhdt,mb,ms,Jdet; 168 IssmDouble gamma,thickness; 169 IssmDouble hnx,hny,dhnx[2],dhny[2]; 170 IssmDouble *xyz_list = NULL; 171 172 /*Fetch number of nodes and dof for this finite element*/ 173 int numnodes = basalelement->GetNumberOfNodes(); 174 175 /*Initialize Element vector*/ 176 ElementVector* pe = basalelement->NewElementVector(); 177 IssmDouble* basis = xNew<IssmDouble>(numnodes); 178 IssmDouble* dbasis = xNew<IssmDouble>(numnodes*2); 179 IssmDouble* H = xNew<IssmDouble>(numnodes); 180 IssmDouble* Nx = xNew<IssmDouble>(numnodes); 181 IssmDouble* Ny = xNew<IssmDouble>(numnodes); 182 183 /*Retrieve all inputs and parameters*/ 184 basalelement->GetVerticesCoordinates(&xyz_list); 185 Input* ms_input = basalelement->GetInput(SurfaceforcingsMassBalanceEnum); _assert_(ms_input); 186 Input* mb_input = basalelement->GetInput(BasalforcingsMeltingRateEnum); _assert_(mb_input); 187 Input* dhdt_input = basalelement->GetInput(BalancethicknessThickeningRateEnum); _assert_(dhdt_input); 188 Input* H_input = basalelement->GetInput(ThicknessEnum); _assert_(H_input); 189 IssmDouble h = basalelement->CharacteristicLength(); 190 191 /*Get vector N for all nodes*/ 192 basalelement->GetInputListOnNodes(Nx,SurfaceSlopeXEnum); 193 basalelement->GetInputListOnNodes(Ny,SurfaceSlopeYEnum); 194 basalelement->GetInputListOnNodes(H,ThicknessEnum); 195 for(int i=0;i<numnodes;i++){ 196 IssmDouble norm=sqrt(Nx[i]*Nx[i]+Ny[i]*Ny[i]+1.e-10); 197 Nx[i] = -H[i]*Nx[i]/norm; 198 Ny[i] = -H[i]*Ny[i]/norm; 199 } 200 201 202 /* Start looping on the number of gaussian points: */ 203 Gauss* gauss=basalelement->NewGauss(2); 204 for(int ig=gauss->begin();ig<gauss->end();ig++){ 205 gauss->GaussPoint(ig); 206 207 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 208 basalelement->NodalFunctions(basis,gauss); 209 basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 210 211 element->ValueP1DerivativesOnGauss(&dhnx[0],Nx,xyz_list,gauss); 212 element->ValueP1DerivativesOnGauss(&dhny[0],Ny,xyz_list,gauss); 213 element->ValueP1OnGauss(&hnx,Nx,gauss); 214 element->ValueP1OnGauss(&hny,Ny,gauss); 215 216 ms_input->GetInputValue(&ms,gauss); 217 mb_input->GetInputValue(&mb,gauss); 218 dhdt_input->GetInputValue(&dhdt,gauss); 219 H_input->GetInputValue(&thickness,gauss); 220 if(thickness<50.) thickness=50.; 221 222 gamma=h/(2.*thickness+1.e-10); 223 224 for(int i=0;i<numnodes;i++){ 225 pe->values[i]+=Jdet*gauss->weight*(ms-mb-dhdt)*( basis[i] + gamma*(basis[i]*(dhnx[0]+dhny[1])+hnx*dbasis[0*numnodes+i] + hny*dbasis[1*numnodes+i])); 226 } 227 } 228 229 /*Clean up and return*/ 230 xDelete<IssmDouble>(xyz_list); 231 xDelete<IssmDouble>(basis); 232 xDelete<IssmDouble>(dbasis); 233 xDelete<IssmDouble>(H); 234 xDelete<IssmDouble>(Nx); 235 xDelete<IssmDouble>(Ny); 236 delete gauss; 237 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 238 return pe; 239 }/*}}}*/ 240 void BalancevelocityAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ 241 _error_("not implemented yet"); 242 }/*}}}*/ 243 void BalancevelocityAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 244 245 int domaintype; 246 element->FindParam(&domaintype,DomainTypeEnum); 247 switch(domaintype){ 248 case Domain2DhorizontalEnum: 249 element->InputUpdateFromSolutionOneDof(solution,VelEnum); 250 break; 251 case Domain3DEnum: 252 element->InputUpdateFromSolutionOneDofCollapsed(solution,VelEnum); 253 break; 254 default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); 255 } 256 }/*}}}*/ 257 void BalancevelocityAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/ 258 /*Default, do nothing*/ 259 return; 260 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.