Changeset 25936


Ignore:
Timestamp:
01/13/21 15:09:59 (4 years ago)
Author:
Cheng Gong
Message:

BUG: fixed a bug in the Nitsche method, where the viscosity should not be multiplied by 2 in the assembly. Also, some improvment in the coding of GLS, but nothing really changed for GLS.

File:
1 edited

Legend:

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

    r25882 r25936  
    41404140                mk = 1.0 /3.0;
    41414141                element->ElementSizes(&hx,&hy,&hz);
    4142                 hk = max(max(hx, hy), hz);
    4143                 // if(!element->IsOnDirichletBoundary()) {
    4144                         Tau = - mk * hk * hk * 0.125 / viscosity;
    4145 
     4142                // hk = max(max(hx, hy), hz);
     4143                hk = max(hx, hy);
     4144                Tau = - mk * hk * hk * 0.125 / viscosity;
    41464145
    41474146                for (int q=0;q<dim;q++){
     
    41494148                        for (int p=0;p<dim;p++){
    41504149                                for(int i=0;i<vnumnodes;i++){
    4151                                         SU[q*vnumnodes*(dim+1)+i*dim+p] = (-gradViscos[p])*vdbasis[q*vnumnodes+i];
     4150                                        SU[q*numdof+i*dim+p] = (-gradViscos[p])*vdbasis[q*vnumnodes+i];
    41524151                                }
    41534152                        }
     
    41554154                        for(int i=0;i<vnumnodes;i++){
    41564155                                for (int p=0;p<dim;p++){
    4157                                         SU[q*vnumnodes*(dim+1)+i*dim+q] += (-gradViscos[p])*vdbasis[p*vnumnodes+i];
     4156                                        SU[q*numdof+i*dim+q] += (-gradViscos[p])*vdbasis[p*vnumnodes+i];
    41584157                                }
    41594158                        }
    41604159                        /* column 4 for the pressure */
    4161                         for(int i=0;i<vnumnodes;i++){
    4162                                         SU[q*vnumnodes*(dim+1)+dim*vnumnodes+i] = FSreconditioning*vdbasis[q*vnumnodes+i];
     4160                        for(int i=0;i<pnumnodes;i++){
     4161                                        SU[q*numdof+dim*vnumnodes+i] = FSreconditioning*vdbasis[q*vnumnodes+i];
    41634162                        }
    41644163                }
     
    42264225        int vnumnodes = element->NumberofNodesVelocity();
    42274226        int pnumnodes = element->NumberofNodesPressure();
     4227        int numdof    = vnumnodes*dim + pnumnodes;
    42284228
    42294229        /*Prepare coordinate system list*/
     
    42914291                mk = 1.0 /3.0;
    42924292                element->ElementSizes(&hx,&hy,&hz);
    4293                 hk = max(max(hx, hy), hz);
    4294                 // if(!element->IsOnDirichletBoundary()) {
    4295                         Tau = - mk * hk * hk * 0.125 / viscosity;
    4296                 // }
    4297                 // else {
    4298                 //      Tau = 0.0;
    4299                 // }
     4293                // hk = max(max(hx, hy), hz);
     4294                hk = max(hx, hy);
     4295                Tau = - mk * hk * hk * 0.125 / viscosity;
    43004296
    43014297                for (int q=0;q<dim;q++){
     
    43034299                        for (int p=0;p<dim;p++){
    43044300                                for(int i=0;i<vnumnodes;i++){
    4305                                         SU[q*vnumnodes*(dim+1)+i*dim+p] = (-gradViscos[p])*vdbasis[q*vnumnodes+i];
     4301                                        SU[q*numdof+i*dim+p] = (-gradViscos[p])*vdbasis[q*vnumnodes+i];
    43064302                                }
    43074303                        }
     
    43094305                        for(int i=0;i<vnumnodes;i++){
    43104306                                for (int p=0;p<dim;p++){
    4311                                         SU[q*vnumnodes*(dim+1)+i*dim+q] += (-gradViscos[p])*vdbasis[p*vnumnodes+i];
     4307                                        SU[q*numdof+i*dim+q] += (-gradViscos[p])*vdbasis[p*vnumnodes+i];
    43124308                                }
    43134309                        }
    43144310                        /* column 4 for the pressure */
    4315                         for(int i=0;i<vnumnodes;i++){
    4316                                         SU[q*vnumnodes*(dim+1)+dim*vnumnodes+i] = FSreconditioning*vdbasis[q*vnumnodes+i];
     4311                        for(int i=0;i<pnumnodes;i++){
     4312                                        SU[q*numdof+dim*vnumnodes+i] = FSreconditioning*vdbasis[q*vnumnodes+i];
    43174313                        }
    43184314                }
    4319 
    43204315                for(i=0;i<vnumnodes;i++){
    43214316                        pe->values[i*dim+0] += +rho_ice*forcex *Jdet*gauss->weight*vbasis[i];
     
    43264321                }
    43274322
    4328                 for(int i=0;i<vnumnodes*(dim+1);i++){
    4329                         pe->values[i] += Tau*Jdet*gauss->weight*rho_ice*(-gravity)*SU[(dim-1)*(dim+1)*vnumnodes+i];
     4323                for(int i=0;i<numdof;i++){
     4324                        pe->values[i] += Tau*Jdet*gauss->weight*rho_ice*(-gravity)*SU[(dim-1)*numdof+i];
    43304325                }
    43314326        }
     
    51595154                for(int i=0;i<vnumnodes;i++){
    51605155                        for(int d=0;d<dim;d++){
    5161                                 nsigma[d*vnumnodes+i] = 2.0 * viscosity * bed_normal[d]*vdbasisn[i];
     5156                                nsigma[d*vnumnodes+i] = 1.0 * viscosity * bed_normal[d]*vdbasisn[i];
    51625157                        }
    51635158                }
     
    51725167                                        for (int q=0; q<dim; q++) {
    51735168                                                /* gamma*(n*u)*(n*v) */
    5174                                                 Ke->values[(dim*i+p)*numdof+dim*j+q] += gauss->weight*Jdet * (-gamma) * bed_normal[q] * vbasis[j]*bed_normal[p] * vbasis[i];
     5169                                                Ke->values[(dim*i+p)*numdof+dim*j+q] += gauss->weight*Jdet * (gamma) * bed_normal[q] * vbasis[j]*bed_normal[p] * vbasis[i];
    51755170                                                /* sigma(u)*(n*v) */
    51765171                                                Ke->values[(dim*i+p)*numdof+dim*j+q] += (- gauss->weight*Jdet)* nsigma[p*vnumnodes+i] * bed_normal[q] * vbasis[j];
Note: See TracChangeset for help on using the changeset viewer.