Changeset 26232


Ignore:
Timestamp:
05/04/21 09:11:16 (4 years ago)
Author:
caronlam
Message:

Adding support for rotationnal feedback in bed Up, East, North

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r26230 r26232  
    61336133        IssmDouble* tide_love_h  = NULL;
    61346134        IssmDouble* tide_love_k  = NULL;
    6135         IssmDouble* load_love_k  = NULL;
    6136         IssmDouble  tide_love_k2secular;
     6135        IssmDouble* tide_love_l  = NULL;
    61376136        IssmDouble  moi_e, moi_p, omega;
    6138         IssmDouble Grotm1[3];
    6139         IssmDouble Grotm2[3];
    6140         IssmDouble Grotm3[3];
    6141         IssmDouble pre;
     6137        IssmDouble  Grotm1[3],GUrotm1[3],GNrotm1[3],GErotm1[3];
     6138        IssmDouble  Grotm2[3],GUrotm2[3],GNrotm2[3],GErotm2[3];
     6139        IssmDouble  Grotm3[3],GUrotm3[3],GNrotm3[3],GErotm3[3];
     6140        IssmDouble  Y21cos     , Y21sin     , Y20;
     6141        IssmDouble dY21cos_dlat,dY21sin_dlat,dY20_dlat;
     6142        IssmDouble dY21cos_dlon,dY21sin_dlon;
     6143        IssmDouble LoveRotRSL,LoveRotU,LoveRothoriz;
    61426144        /*}}}*/
    61436145        /*Recover parameters:{{{ */
     
    61536155
    61546156        if(computerotation){
    6155                 parameters->FindParam(&load_love_k,NULL,NULL,LoadLoveKEnum);
    61566157                parameters->FindParam(&tide_love_h,NULL,NULL,TidalLoveHEnum);
    61576158                parameters->FindParam(&tide_love_k,NULL,NULL,TidalLoveKEnum);
    6158                 parameters->FindParam(&tide_love_k2secular,TidalLoveK2SecularEnum);
     6159                parameters->FindParam(&tide_love_l,NULL,NULL,TidalLoveLEnum);
    61596160                parameters->FindParam(&moi_e,RotationalEquatorialMoiEnum);
    61606161                parameters->FindParam(&moi_p,RotationalPolarMoiEnum);
     
    62706271                g=4.0/3.0*M_PI*rho_earth*NewtonG*planetradius;
    62716272
     6273                //Amplitude of the rotational feedback
     6274                LoveRotRSL=((1.0+tide_love_k[2]-tide_love_h[2])/g)*pow(omega*planetradius,2.0);
     6275                LoveRotU=(tide_love_h[2]/g)*pow(omega*planetradius,2.0);
     6276                LoveRothoriz=(tide_love_l[2]/g)*pow(omega*planetradius,2.0);
     6277
    62726278                for(int i=0;i<3;i++){
    62736279                        lati=latitude[i];
    62746280                        longi=longitude[i];
    62756281
    6276                         pre=((1.0+tide_love_k[2]-tide_love_h[2])/g)*pow(omega*planetradius,2.0);
    6277                         Grotm1[i]= - pre* 0.5*sin(2.*lati)*cos(longi);
    6278                         Grotm2[i]= - pre* 0.5*sin(2.*lati)*sin(longi);
    6279                         Grotm3[i]= - pre* (1.0/6.0 - 0.5*cos(2.0*lati));
     6282                        //Spherical harmonic functions of degree 2
     6283                        Y21cos= -0.5*sin(2.*lati)*cos(longi);
     6284                        Y21sin= -0.5*sin(2.*lati)*sin(longi);
     6285                        Y20   = -(1.0/6.0 - 0.5*cos(2.0*lati));
     6286
     6287                        Grotm1[i]=  LoveRotRSL*Y21cos;
     6288                        Grotm2[i]=  LoveRotRSL*Y21sin;
     6289                        Grotm3[i]=  LoveRotRSL*Y20;
     6290
     6291                        if (computeelastic){
     6292                                GUrotm1[i]=  LoveRotU*Y21cos;
     6293                                GUrotm2[i]=  LoveRotU*Y21sin;
     6294                                GUrotm3[i]=  LoveRotU*Y20;
     6295                                if (horiz){
     6296                                //bed_N = Love_l * d(Y)/dlat ;
     6297                                dY21cos_dlat=-cos(2.*lati)*cos(longi);
     6298                                dY21sin_dlat=-cos(2.*lati)*sin(longi);
     6299                                dY20_dlat=-sin(2.0*lati);
     6300                                GNrotm1[i]=  LoveRothoriz*dY21cos_dlat;
     6301                                GNrotm2[i]=  LoveRothoriz*dY21sin_dlat;
     6302                                GNrotm3[i]=  LoveRothoriz*dY20_dlat;
     6303
     6304                                //bed_E = Love_l * 1/cos(lat) * d(Y)/dlon ;
     6305                                dY21cos_dlon=-Y21sin;
     6306                                dY21sin_dlon=Y21cos;
     6307                                //dY20_dlon=0.;
     6308                                GNrotm1[i]=  LoveRothoriz*dY21cos_dlon/cos(lati);
     6309                                GNrotm2[i]=  LoveRothoriz*dY21sin_dlon/cos(lati);
     6310                                GNrotm3[i]=  0.0;
     6311                                }
     6312                        }
    62806313                }
    62816314                this->AddInput(SealevelGrotm1Enum,&Grotm1[0],P1Enum);
    62826315                this->AddInput(SealevelGrotm2Enum,&Grotm2[0],P1Enum);
    62836316                this->AddInput(SealevelGrotm3Enum,&Grotm3[0],P1Enum);
     6317                if (computeelastic){
     6318                        this->AddInput(SealevelGUrotm1Enum,&GUrotm1[0],P1Enum);
     6319                        this->AddInput(SealevelGUrotm2Enum,&GUrotm2[0],P1Enum);
     6320                        this->AddInput(SealevelGUrotm3Enum,&GUrotm3[0],P1Enum);
     6321                        if(horiz){
     6322                                this->AddInput(SealevelGNrotm1Enum,&GNrotm1[0],P1Enum);
     6323                                this->AddInput(SealevelGNrotm2Enum,&GNrotm2[0],P1Enum);
     6324                                this->AddInput(SealevelGNrotm3Enum,&GNrotm3[0],P1Enum);
     6325                                this->AddInput(SealevelGErotm1Enum,&GErotm1[0],P1Enum);
     6326                                this->AddInput(SealevelGErotm2Enum,&GErotm2[0],P1Enum);
     6327                                this->AddInput(SealevelGErotm3Enum,&GErotm3[0],P1Enum);
     6328                        }
     6329                }
    62846330        }
    62856331        /*}}}*/
     
    69957041        IssmDouble Grotm2[3];
    69967042        IssmDouble Grotm3[3];
     7043        IssmDouble GUrotm1[3];
     7044        IssmDouble GUrotm2[3];
     7045        IssmDouble GUrotm3[3];
     7046        IssmDouble GNrotm1[3];
     7047        IssmDouble GNrotm2[3];
     7048        IssmDouble GNrotm3[3];
     7049        IssmDouble GErotm1[3];
     7050        IssmDouble GErotm2[3];
     7051        IssmDouble GErotm3[3];
    69977052        bool rotation= false;
    69987053        bool elastic=false;
     
    70537108                        }
    70547109                }
     7110
     7111                if (elastic){
     7112                        Element::GetInputListOnVertices(&GUrotm1[0],SealevelGUrotm1Enum);
     7113                        Element::GetInputListOnVertices(&GUrotm2[0],SealevelGUrotm2Enum);
     7114                        Element::GetInputListOnVertices(&GUrotm3[0],SealevelGUrotm3Enum);
     7115               
     7116                        for(int i=0;i<NUMVERTICES;i++){
     7117                                if(slgeom->lids[this->vertices[i]->lid]==this->lid){
     7118                                        SealevelU[i]+=GUrotm1[i]*rotationvector[0]+GUrotm2[i]*rotationvector[1]+GUrotm3[i]*rotationvector[2];
     7119                                }
     7120                        }
     7121                        if (horiz){
     7122                                Element::GetInputListOnVertices(&GNrotm1[0],SealevelGNrotm1Enum);
     7123                                Element::GetInputListOnVertices(&GNrotm2[0],SealevelGNrotm2Enum);
     7124                                Element::GetInputListOnVertices(&GNrotm3[0],SealevelGNrotm3Enum);
     7125                                Element::GetInputListOnVertices(&GErotm1[0],SealevelGErotm1Enum);
     7126                                Element::GetInputListOnVertices(&GErotm2[0],SealevelGErotm2Enum);
     7127                                Element::GetInputListOnVertices(&GErotm3[0],SealevelGErotm3Enum);
     7128               
     7129                                for(int i=0;i<NUMVERTICES;i++){
     7130                                        if(slgeom->lids[this->vertices[i]->lid]==this->lid){
     7131                                                SealevelN[i]+=GNrotm1[i]*rotationvector[0]+GNrotm2[i]*rotationvector[1]+GNrotm3[i]*rotationvector[2];
     7132                                                SealevelE[i]+=GErotm1[i]*rotationvector[0]+GErotm2[i]*rotationvector[1]+GErotm3[i]*rotationvector[2];
     7133                                        }
     7134                                }
     7135                        }
     7136                }
    70557137        }
    70567138
     
    70627144        this->AddInput(BedGRDEnum,SealevelU,P1Enum);
    70637145        if(horiz){
     7146                this->AddInput(BedNorthGRDEnum,SealevelN,P1Enum);
    70647147                this->AddInput(BedEastGRDEnum,SealevelE,P1Enum);
    7065                 this->AddInput(BedNorthGRDEnum,SealevelN,P1Enum);
    70667148        }
    70677149
Note: See TracChangeset for help on using the changeset viewer.