Changeset 19986


Ignore:
Timestamp:
01/22/16 10:47:46 (9 years ago)
Author:
Eric.Larour
Message:

CHG: added precomputation of legendre polynomials.

Location:
issm/trunk-jpl/src
Files:
8 edited

Legend:

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

    r19984 r19986  
    3838void SealevelriseAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/
    3939
    40         int nl;
     40        int         nl;
    4141        IssmDouble* love_h=NULL;
    4242        IssmDouble* love_k=NULL;
     43       
     44        bool        legendre_precompute=false;
     45        IssmDouble* legendre_coefficients=NULL;
     46        int         M;
    4347
     48        /*some constant parameters: */
    4449        parameters->AddObject(iomodel->CopyConstantObject(SealevelriseReltolEnum));
    4550        parameters->AddObject(iomodel->CopyConstantObject(SealevelriseAbstolEnum));
     
    4853        parameters->AddObject(iomodel->CopyConstantObject(SealevelriseElasticEnum));
    4954        parameters->AddObject(iomodel->CopyConstantObject(SealevelriseEustaticEnum));
     55        parameters->AddObject(iomodel->CopyConstantObject(SealevelriseLegendrePrecomputeEnum));
     56
    5057       
     58        /*love numbers: */
    5159        iomodel->FetchData(&love_h,&nl,NULL,SealevelriseLoveHEnum);
    5260        iomodel->FetchData(&love_k,&nl,NULL,SealevelriseLoveKEnum);
    53        
    5461        parameters->AddObject(new DoubleVecParam(SealevelriseLoveHEnum,love_h,nl));
    5562        parameters->AddObject(new DoubleVecParam(SealevelriseLoveKEnum,love_k,nl));
     63
     64        /*legendre coefficients: */
     65        iomodel->Constant(&legendre_precompute,SealevelriseLegendrePrecomputeEnum);
     66        if(legendre_precompute){
     67                iomodel->FetchData(&legendre_coefficients,&M,&nl,SealevelriseLoveKEnum);
     68                parameters->AddObject(new DoubleMatParam(SealevelriseLegendreCoefficientsEnum,legendre_coefficients,M,nl));
     69        }
    5670
    5771        /*free ressources: */
    5872        xDelete<IssmDouble>(love_h);
    5973        xDelete<IssmDouble>(love_k);
     74        xDelete<IssmDouble>(legendre_coefficients);
    6075
    6176}/*}}}*/
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r19984 r19986  
    35213521        int nl;
    35223522
     3523        /*legendre coefficients:*/
     3524        bool        legendre_precompute=false;
     3525        IssmDouble* legendre_coefficients=NULL;
     3526        int         M;
     3527
    35233528        /*ice properties: */
    35243529        IssmDouble rho_ice,rho_water,rho_earth;
    3525 
    3526         /*other constants: */
    3527         //IssmDouble g;
    35283530
    35293531        /*Solution outputs: */
     
    35503552        this->parameters->FindParam(&computeeustatic,SealevelriseEustaticEnum);
    35513553
     3554        /*recover legendre coefficients if they have been precomputed:*/
     3555        this->parameters->FindParam(&legendre_precompute,SealevelriseLegendrePrecomputeEnum);
     3556        this->parameters->FindParam(&legendre_coefficients,&M,NULL,SealevelriseLegendrePrecomputeEnum);
     3557
    35523558        /*how many dofs are we working with here? */
    35533559        this->parameters->FindParam(&gsize,MeshNumberofverticesEnum);
     
    36143620                        IssmDouble G_rigid=0;  //do not remove =0!
    36153621                        IssmDouble G_elastic=0;  //do not remove =0!
    3616                         IssmDouble Pn1,Pn2; //first two legendre polynomials
     3622                        IssmDouble Pn1,Pn2,Pn; //first two legendre polynomials
    36173623                        IssmDouble cosalpha;
    36183624
     
    36313637                        if(computeelastic){
    36323638                                G_elastic = (love_k[nl-1]-love_h[nl-1])/2.0/sin(alpha/2.0);
    3633                                 for(int n=0;n<nl;n++) G_elastic += deltalove[n]*legendre(Pn1,Pn2,n,cosalpha);
     3639                                if(legendre_precompute){
     3640                                        for(int n=0;n<nl;n++) G_elastic += deltalove[n]*legendre_coefficients[(int)((M-1)*(cosalpha+1.0)/2.0)*nl+n];
     3641                                }
     3642                                else{
     3643                                        for(int n=0;n<nl;n++){
     3644                                                Pn=legendre(Pn1,Pn2,n,cosalpha); Pn1=Pn2; Pn2=Pn;
     3645                                                G_elastic += deltalove[n]*Pn;
     3646                                        }
     3647                                }
    36343648                        }
    36353649
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r19978 r19986  
    10321032        SealevelriseElasticEnum,
    10331033        SealevelriseEustaticEnum,
     1034        SealevelriseLegendrePrecomputeEnum,
     1035        SealevelriseLegendreCoefficientsEnum,
    10341036        /*}}}*/
    10351037        MaximumNumberOfDefinitionsEnum
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r19978 r19986  
    986986                case SealevelriseElasticEnum : return "SealevelriseElastic";
    987987                case SealevelriseEustaticEnum : return "SealevelriseEustatic";
     988                case SealevelriseLegendrePrecomputeEnum : return "SealevelriseLegendrePrecompute";
     989                case SealevelriseLegendreCoefficientsEnum : return "SealevelriseLegendreCoefficients";
    988990                case MaximumNumberOfDefinitionsEnum : return "MaximumNumberOfDefinitions";
    989991                default : return "unknown";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r19978 r19986  
    10101010              else if (strcmp(name,"SealevelriseElastic")==0) return SealevelriseElasticEnum;
    10111011              else if (strcmp(name,"SealevelriseEustatic")==0) return SealevelriseEustaticEnum;
     1012              else if (strcmp(name,"SealevelriseLegendrePrecompute")==0) return SealevelriseLegendrePrecomputeEnum;
     1013              else if (strcmp(name,"SealevelriseLegendreCoefficients")==0) return SealevelriseLegendreCoefficientsEnum;
    10121014              else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
    10131015         else stage=10;
  • issm/trunk-jpl/src/m/classes/slr.m

    r19984 r19986  
    1515                elastic         = 0;
    1616                eustatic         = 0;
     17                legendre_precompute = 0;
     18                legendre_coefficients = NaN;
    1719        end
    1820        methods
     
    3840                self.elastic=1;
    3941                self.eustatic=1;
     42               
     43                %legendre coefficients:
     44                legendre_precompute = 0;
     45                legendre_coefficients = NaN;
    4046
    4147                end % }}}
     
    5561                        end
    5662
     63                        %check that the legendre coefficients have indeed been computed if requested:
     64                        if self.legendre_precompute,
     65                                md = checkfield(md,'fieldname','slr.legendre_coefficients','NaN',1,'Inf',1,'size',[NaN length(self.love_h)]);
     66                        end
     67
    5768                end % }}}
    5869                function disp(self) % {{{
     
    6879                        fielddisplay(self,'elastic','elastic earth graviational potential perturbation');
    6980                        fielddisplay(self,'eustatic','eustatic sea level rise');
     81                        fielddisplay(self,'legendre_precompute','precompute legendre coefficients? (default is 0)');
     82                        if(self.legendre_precompute)
     83                                fielddisplay(self,'legendre_coefficients','precomputed legendre coefficients');
     84                        end
    7085
    7186                end % }}}
     
    8095                        WriteData(fid,'object',self,'class','sealevelrise','fieldname','elastic','format','Boolean');
    8196                        WriteData(fid,'object',self,'class','sealevelrise','fieldname','eustatic','format','Boolean');
     97                        WriteData(fid,'object',self,'class','sealevelrise','fieldname','legendre_precompute','format','Boolean');
     98                        if(self.legendre_precompute),
     99                                WriteData(fid,'object',self,'class','sealevelrise','fieldname','legendre_coefficients','format','DoubleMat','mattype',1);
     100                        end
    82101                end % }}}
    83102                function savemodeljs(self,fid,modelname) % {{{
     
    91110                        writejsdouble(fid,[modelname '.slr.rigid'],self.rigid);
    92111                        writejsdouble(fid,[modelname '.slr.eustatic'],self.eustatic);
     112                        writejsdouble(fid,[modelname '.slr.legendre_precompute'],self.legendre_precompute);
     113                        if self.legendre_precompute,
     114                                writejs2Darray(fid,[modelname '.srl.legendre_coefficients'],self.legendre_coefficients);
     115                        end
    93116
    94117                end % }}}
  • issm/trunk-jpl/src/m/enum/EnumDefinitions.js

    r19978 r19986  
    971971function SealevelriseElasticEnum(){ return 967;}
    972972function SealevelriseEustaticEnum(){ return 968;}
    973 function MaximumNumberOfDefinitionsEnum(){ return 969;}
     973function SealevelriseLegendrePrecomputeEnum(){ return 969;}
     974function SealevelriseLegendreCoefficientsEnum(){ return 970;}
     975function MaximumNumberOfDefinitionsEnum(){ return 971;}
  • issm/trunk-jpl/src/m/enum/EnumDefinitions.py

    r19978 r19986  
    978978def SealevelriseElasticEnum(): return StringToEnum("SealevelriseElastic")[0]
    979979def SealevelriseEustaticEnum(): return StringToEnum("SealevelriseEustatic")[0]
     980def SealevelriseLegendrePrecomputeEnum(): return StringToEnum("SealevelriseLegendrePrecompute")[0]
     981def SealevelriseLegendreCoefficientsEnum(): return StringToEnum("SealevelriseLegendreCoefficients")[0]
    980982def MaximumNumberOfDefinitionsEnum(): return StringToEnum("MaximumNumberOfDefinitions")[0]
Note: See TracChangeset for help on using the changeset viewer.