Changeset 25945
- Timestamp:
- 01/19/21 03:10:32 (4 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r25936 r25945 5048 5048 /*coefficient of Nitsche's method*/ 5049 5049 IssmDouble gamma, hx, hy, hz; 5050 IssmDouble pnu, qnv;5051 5050 5052 5051 /*Get problem dimension*/ … … 5065 5064 IssmDouble* vdbasis = xNew<IssmDouble>(dim*vnumnodes); 5066 5065 IssmDouble* pbasis = xNew<IssmDouble>(pnumnodes); 5067 IssmDouble* vdbasisn = xNew<IssmDouble>(vnumnodes);5068 IssmDouble* nsigma = xNew<IssmDouble>(numdof);5069 IssmDouble bed_normal[3], bed_tangent[6];5070 5066 5071 5067 /*Prepare coordinate system list*/ … … 5100 5096 } 5101 5097 5102 element->NormalBase(&bed_normal[0],xyz_list_base);5103 element->TangentBase(&bed_tangent[0], &bed_normal[0]);5104 5098 element->ElementSizes(&hx,&hy,&hz); 5105 5099 element->FindParam(&gamma,FeFSNitscheGammaEnum); … … 5126 5120 element->NodalFunctionsPressure(pbasis,gauss); 5127 5121 element->material->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input); 5128 5129 /*Frictions*/ 5122 5130 5123 for(int i=0;i<vnumnodes;i++){ 5131 5124 for(int j=0;j<vnumnodes;j++){ 5132 for (int d=0; d<2; d++) { 5133 for (int p=0; p<dim; p++) { 5134 for (int q=0; q<dim; q++) { 5135 Ke->values[(dim*i+p)*numdof+dim*j+q] += alpha2*gauss->weight*Jdet*vbasis[i]*vbasis[j]*bed_tangent[d*3+p]*bed_tangent[d*3+q]; 5136 } 5137 } 5125 for (int d=0; d<dim; d++) { 5126 Ke->values[(dim*i+d)*numdof+dim*j+d] += alpha2*gauss->weight*Jdet*vbasis[i]*vbasis[j]; 5138 5127 } 5139 5128 } 5140 5129 } 5141 5130 /* -------- Nitsche terms -------- */ 5142 /* n\cdot\nabla\phi*/5143 for(int i=0;i<vnumnodes;i++){5144 vdbasisn[i] = 0.0;5145 for (int d=0; d<dim; d++) {5146 vdbasisn[i] += bed_normal[d]*vdbasis[d*vnumnodes+i];5147 }5148 }5149 5131 /* Boundary terms for integration by parts. 5150 5132 The coefficient matrix of n*sigma*n-gamma*n*u is stored in the following order: … … 5153 5135 */ 5154 5136 for(int i=0;i<vnumnodes;i++){ 5155 for(int d=0;d<dim;d++){ 5156 nsigma[d*vnumnodes+i] = 1.0 * viscosity * bed_normal[d]*vdbasisn[i]; 5137 for(int j=0;j<vnumnodes;j++){ 5138 /* gamma*(n*u)*(n*v) */ 5139 Ke->values[(dim*i+(dim-1))*numdof+dim*j+(dim-1)] += gauss->weight*Jdet * (gamma*viscosity) * vbasis[j] * vbasis[i]; 5140 /* -sigma(v)*(n*u) */ 5141 Ke->values[(dim*i+(dim-1))*numdof+dim*j+(dim-1)] += (- gauss->weight*Jdet) * 2.0 * viscosity * (-vbasis[j]) * vdbasis[(dim-1)*vnumnodes+i]; 5142 /* -sigma(u)*(n*v) */ 5143 Ke->values[(dim*i+(dim-1))*numdof+dim*j+(dim-1)] += (- gauss->weight*Jdet) * 2.0 * viscosity * vdbasis[(dim-1)*vnumnodes+j] * (-vbasis[i]); 5157 5144 } 5158 5145 } 5159 for(int i=0;i<pnumnodes;i++){ 5160 nsigma[dim*vnumnodes+i] = -FSreconditioning*pbasis[i]; 5161 } 5162 5163 /*velocity components A11 */ 5164 for(int i=0;i<vnumnodes;i++){ 5165 for (int p=0; p<dim; p++) { 5166 for(int j=0;j<vnumnodes;j++){ 5167 for (int q=0; q<dim; q++) { 5168 /* gamma*(n*u)*(n*v) */ 5169 Ke->values[(dim*i+p)*numdof+dim*j+q] += gauss->weight*Jdet * (gamma) * bed_normal[q] * vbasis[j]*bed_normal[p] * vbasis[i]; 5170 /* sigma(u)*(n*v) */ 5171 Ke->values[(dim*i+p)*numdof+dim*j+q] += (- gauss->weight*Jdet)* nsigma[p*vnumnodes+i] * bed_normal[q] * vbasis[j]; 5172 /* sigma(v)*(n*u) */ 5173 Ke->values[(dim*i+p)*numdof+dim*j+q] += (- gauss->weight*Jdet)* bed_normal[p] * vbasis[i] * nsigma[q*vnumnodes+j]; 5174 } 5175 } 5146 /* pressure x velocity component A12, +p*(n*v) */ 5147 for(int k=0;k<pnumnodes;k++){ 5148 for(int i=0;i<vnumnodes;i++){ 5149 Ke->values[(dim*i+dim-1)*numdof+dim*vnumnodes+k] += gauss->weight*Jdet * FSreconditioning*pbasis[k] * (-vbasis[i]); 5176 5150 } 5177 5151 } 5178 5179 /* pressure x velocity component A12 */ 5152 /* velocity x pressure component A21, +(n*u)*q */ 5180 5153 for(int k=0;k<pnumnodes;k++){ 5181 pnu = nsigma[dim*vnumnodes+k]; 5182 for(int i=0;i<vnumnodes;i++){ 5183 for (int p=0;p<dim;p++) { 5184 Ke->values[(dim*i+p)*numdof+dim*vnumnodes+k] += gauss->weight*Jdet * pnu * (- bed_normal[p] * vbasis[i]); 5185 } 5154 for(int j=0;j<vnumnodes;j++){ 5155 Ke->values[(dim*vnumnodes+k)*numdof+dim*j+dim-1] += gauss->weight*Jdet * (-vbasis[j]) * FSreconditioning*pbasis[k]; 5186 5156 } 5187 5157 } 5188 /* velocity x pressure component A21 */ 5189 for(int k=0;k<pnumnodes;k++){ 5190 qnv = nsigma[dim*vnumnodes+k]; 5191 for(int j=0;j<vnumnodes;j++){ 5192 for (int q=0;q<dim;q++) { 5193 Ke->values[(dim*vnumnodes+k)*numdof+dim*j+q] += gauss->weight*Jdet * ( - bed_normal[q] * vbasis[j]) * qnv; 5194 } 5195 } 5196 } 5197 } 5198 5199 /*Transform Coordinate System*/ 5200 element->TransformStiffnessMatrixCoord(Ke,cs_list); 5158 } 5201 5159 5202 5160 /*Clean up and return*/ … … 5208 5166 xDelete<IssmDouble>(vdbasis); 5209 5167 xDelete<IssmDouble>(pbasis); 5210 xDelete<IssmDouble>(vdbasisn);5211 xDelete<IssmDouble>(nsigma);5212 xDelete<int>(cs_list);5213 5168 return Ke; 5214 5169 }/*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r25934 r25945 3327 3327 int numindices; 3328 3328 int *indices = NULL; 3329 bool isNitsche; 3329 3330 IssmDouble slopex,slopey,groundedice; 3330 3331 IssmDouble xz_plane[6]; … … 3333 3334 /*For FS only: we want the CS to be tangential to the bedrock*/ 3334 3335 this->Element::GetInputValue(&approximation,ApproximationEnum); 3336 this->FindParam(&isNitsche,FlowequationIsNitscheEnum); 3337 3335 3338 if(!IsOnBase() || (approximation!=FSApproximationEnum && approximation!=SSAFSApproximationEnum && approximation!=HOFSApproximationEnum)) return; 3336 3339 … … 3357 3360 xz_plane[2]=slopex; xz_plane[5]=1.; 3358 3361 3359 if(groundedice>=0){ 3360 if(this->nodes[indices[i]]->GetApproximation()==FSvelocityEnum){ 3361 this->nodes[indices[i]]->DofInSSet(2); //vz 3362 if (!isNitsche) { 3363 if(groundedice>=0){ 3364 if(this->nodes[indices[i]]->GetApproximation()==FSvelocityEnum){ 3365 this->nodes[indices[i]]->DofInSSet(2); //vz 3366 } 3367 else if(this->nodes[indices[i]]->GetApproximation()==SSAFSApproximationEnum || this->nodes[indices[i]]->GetApproximation()==HOFSApproximationEnum){ 3368 this->nodes[indices[i]]->DofInSSet(4); //vz 3369 } 3370 else _error_("Flow equation approximation"<<EnumToStringx(this->nodes[indices[i]]->GetApproximation())<<" not supported yet"); 3362 3371 } 3363 else if(this->nodes[indices[i]]->GetApproximation()==SSAFSApproximationEnum || this->nodes[indices[i]]->GetApproximation()==HOFSApproximationEnum){ 3364 this->nodes[indices[i]]->DofInSSet(4); //vz 3372 else{ 3373 if(this->nodes[indices[i]]->GetApproximation()==FSvelocityEnum){ 3374 this->nodes[indices[i]]->DofInFSet(2); //vz 3375 } 3376 else if(this->nodes[indices[i]]->GetApproximation()==SSAFSApproximationEnum || this->nodes[indices[i]]->GetApproximation()==HOFSApproximationEnum){ 3377 this->nodes[indices[i]]->DofInFSet(4); //vz 3378 } 3379 else _error_("Flow equation approximation"<<EnumToStringx(this->nodes[indices[i]]->GetApproximation())<<" not supported yet"); 3365 3380 } 3366 else _error_("Flow equation approximation"<<EnumToStringx(this->nodes[indices[i]]->GetApproximation())<<" not supported yet"); 3367 } 3368 else{ 3369 if(this->nodes[indices[i]]->GetApproximation()==FSvelocityEnum){ 3370 this->nodes[indices[i]]->DofInFSet(2); //vz 3371 } 3372 else if(this->nodes[indices[i]]->GetApproximation()==SSAFSApproximationEnum || this->nodes[indices[i]]->GetApproximation()==HOFSApproximationEnum){ 3373 this->nodes[indices[i]]->DofInFSet(4); //vz 3374 } 3375 else _error_("Flow equation approximation"<<EnumToStringx(this->nodes[indices[i]]->GetApproximation())<<" not supported yet"); 3376 } 3377 3381 } 3378 3382 XZvectorsToCoordinateSystem(&this->nodes[indices[i]]->coord_system[0][0],&xz_plane[0]); 3379 3383 } -
issm/trunk-jpl/src/c/cores/stressbalance_core.cpp
r25680 r25945 47 47 bedslope_core(femmodel); 48 48 femmodel->SetCurrentConfiguration(StressbalanceAnalysisEnum); 49 if (!isNitsche) { 50 ResetFSBasalBoundaryConditionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 51 } 49 ResetFSBasalBoundaryConditionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 52 50 53 51 /*We need basal melt rates for the shelf dampening*/
Note:
See TracChangeset
for help on using the changeset viewer.