Changeset 25945


Ignore:
Timestamp:
01/19/21 03:10:32 (4 years ago)
Author:
Cheng Gong
Message:

CHG: use rotated coordinate system for Nitsches method, tested with ISMIP A-D, works for MINIcondensed and P1P1GLS. This implementation is currently only avaliable for 3D FS.

Location:
issm/trunk-jpl/src/c
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

    r25936 r25945  
    50485048        /*coefficient of Nitsche's method*/
    50495049        IssmDouble gamma, hx, hy, hz;
    5050         IssmDouble pnu, qnv;
    50515050
    50525051        /*Get problem dimension*/
     
    50655064        IssmDouble* vdbasis = xNew<IssmDouble>(dim*vnumnodes);
    50665065        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];
    50705066
    50715067        /*Prepare coordinate system list*/
     
    51005096        }
    51015097
    5102         element->NormalBase(&bed_normal[0],xyz_list_base);
    5103         element->TangentBase(&bed_tangent[0], &bed_normal[0]);
    51045098        element->ElementSizes(&hx,&hy,&hz);
    51055099        element->FindParam(&gamma,FeFSNitscheGammaEnum);
     
    51265120                element->NodalFunctionsPressure(pbasis,gauss);
    51275121                element->material->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
    5128 
    5129                 /*Frictions*/
     5122               
    51305123                for(int i=0;i<vnumnodes;i++){
    51315124                        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];
    51385127                                }
    51395128                        }
    51405129                }
    51415130                /* -------- 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                 }
    51495131                /* Boundary terms for integration by parts.
    51505132                        The coefficient matrix of n*sigma*n-gamma*n*u is stored in the following order:
     
    51535135                */
    51545136                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]);
    51575144                        }
    51585145                }
    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]);
    51765150                        }
    51775151                }
    5178 
    5179                 /* pressure x velocity  component A12 */
     5152                /* velocity x pressure component A21, +(n*u)*q */
    51805153                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];
    51865156                        }
    51875157                }
    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        }
    52015159
    52025160        /*Clean up and return*/
     
    52085166        xDelete<IssmDouble>(vdbasis);
    52095167        xDelete<IssmDouble>(pbasis);
    5210         xDelete<IssmDouble>(vdbasisn);
    5211         xDelete<IssmDouble>(nsigma);
    5212         xDelete<int>(cs_list);
    52135168        return Ke;
    52145169}/*}}}*/
  • issm/trunk-jpl/src/c/classes/Elements/Penta.cpp

    r25934 r25945  
    33273327        int          numindices;
    33283328        int         *indices = NULL;
     3329        bool            isNitsche;
    33293330        IssmDouble   slopex,slopey,groundedice;
    33303331        IssmDouble   xz_plane[6];
     
    33333334        /*For FS only: we want the CS to be tangential to the bedrock*/
    33343335        this->Element::GetInputValue(&approximation,ApproximationEnum);
     3336        this->FindParam(&isNitsche,FlowequationIsNitscheEnum);
     3337
    33353338        if(!IsOnBase() || (approximation!=FSApproximationEnum && approximation!=SSAFSApproximationEnum &&  approximation!=HOFSApproximationEnum)) return;
    33363339
     
    33573360                xz_plane[2]=slopex;   xz_plane[5]=1.;
    33583361
    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");
    33623371                        }
    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");
    33653380                        }
    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                }
    33783382                XZvectorsToCoordinateSystem(&this->nodes[indices[i]]->coord_system[0][0],&xz_plane[0]);
    33793383        }
  • issm/trunk-jpl/src/c/cores/stressbalance_core.cpp

    r25680 r25945  
    4747                bedslope_core(femmodel);
    4848                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);
    5250
    5351                /*We need basal melt rates for the shelf dampening*/
Note: See TracChangeset for help on using the changeset viewer.