Changeset 20033


Ignore:
Timestamp:
01/30/16 19:12:44 (9 years ago)
Author:
Eric.Larour
Message:

CHG: parallelized computation of G_elastic in the Sealevelrise UpdateParameters analysis phase.

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

Legend:

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

    r20030 r20033  
    4545        bool elastic=false;
    4646        IssmDouble* G_elastic = NULL;
    47         int         M;
     47        IssmDouble* G_elastic_local = NULL;
     48        int         M,m,lower_row,upper_row;
     49        IssmDouble  degacc=.01;
    4850
    4951        /*some constant parameters: */
     
    6365
    6466                /*compute elastic green function for a range of angles*/
    65                 IssmDouble degacc=.01; M=reCast<int,IssmDouble>(180./degacc+1.);
     67                iomodel->FetchData(&degacc,SealevelriseDegaccEnum);
     68                M=reCast<int>(180/degacc+1);
    6669                G_elastic=xNew<IssmDouble>(M);
    6770
    6871                /*compute combined legendre + love number (elastic green function:*/
    69                 for(int i=0;i<M;i++){ //watch out the <=
     72                m=DetermineLocalSize(M,IssmComm::GetComm());
     73                GetOwnershipBoundariesFromRange(&lower_row,&upper_row,m,IssmComm::GetComm());
     74                G_elastic_local=xNew<IssmDouble>(m);
     75
     76                for(int i=lower_row;i<upper_row;i++){
     77                        IssmDouble alpha,x;
     78                        alpha= reCast<IssmDouble>(i)*degacc * PI / 180.0;
     79
     80                        G_elastic_local[i-lower_row]= (love_k[nl-1]-love_h[nl-1])/2.0/sin(alpha/2.0);
     81                        for (int n=0;n<nl;n++) {
     82                                IssmDouble Pn,Pn1,Pn2;
     83                                IssmDouble deltalove;
     84
     85                                deltalove = (love_k[n]-love_k[nl-1]-love_h[n]+love_h[nl-1]);
     86
     87                                if(n==0)Pn=1;
     88                                else if(n==1)Pn=cos(alpha);
     89                                else Pn= ( (2*n-1)*cos(alpha)*Pn1 - (n-1)*Pn2 ) /n;
     90                                Pn2=Pn1; Pn1=Pn;
     91
     92                                G_elastic_local[i-lower_row] += deltalove*Pn;
     93                        }
     94                }
     95
     96                /*merge G_elastic_local into G_elastic:{{{*/
     97                int* recvcounts=xNew<int>(IssmComm::GetSize());
     98                int* displs=xNew<int>(IssmComm::GetSize());
     99
     100                //recvcounts:
     101                ISSM_MPI_Allgather(&m,1,ISSM_MPI_INT,recvcounts,1,ISSM_MPI_INT,IssmComm::GetComm());
     102
     103                /*displs: */
     104                ISSM_MPI_Allgather(&lower_row,1,ISSM_MPI_INT,displs,1,ISSM_MPI_INT,IssmComm::GetComm());
     105
     106                /*All gather:*/
     107                ISSM_MPI_Allgatherv(G_elastic_local, m, ISSM_MPI_DOUBLE, G_elastic, recvcounts, displs, ISSM_MPI_DOUBLE,IssmComm::GetComm());
     108                /*free ressources: */
     109                xDelete<int>(recvcounts);
     110                xDelete<int>(displs);
     111
     112                /*}}}*/
     113
     114                /*Old code: {{{*/
     115                /*for(int i=0;i<M;i++){
    70116                        IssmDouble alpha,x;
    71117                        alpha= reCast<IssmDouble>(i)*degacc * PI / 180.0;
     
    85131                                G_elastic[i] += deltalove*Pn;
    86132                        }
    87                 }
     133                }*/
     134                /*}}}*/
    88135
    89136                /*Avoid singularity at 0: */
     
    91138                parameters->AddObject(new DoubleVecParam(SealevelriseGElasticEnum,G_elastic,M));
    92139
    93                 /*free ressources:*/
    94                 xDelete<IssmDouble>(G_elastic);
    95 
    96140                /*free ressources: */
    97141                xDelete<IssmDouble>(love_h);
    98142                xDelete<IssmDouble>(love_k);
    99143                xDelete<IssmDouble>(G_elastic);
     144                xDelete<IssmDouble>(G_elastic_local);
    100145        }
    101146
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r20028 r20033  
    10481048        SealevelriseEustaticEnum,
    10491049        SealevelriseGElasticEnum,
     1050        SealevelriseDegaccEnum,
    10501051        /*}}}*/
    10511052        MaximumNumberOfDefinitionsEnum
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r20028 r20033  
    10021002                case SealevelriseEustaticEnum : return "SealevelriseEustatic";
    10031003                case SealevelriseGElasticEnum : return "SealevelriseGElastic";
     1004                case SealevelriseDegaccEnum : return "SealevelriseDegacc";
    10041005                case MaximumNumberOfDefinitionsEnum : return "MaximumNumberOfDefinitions";
    10051006                default : return "unknown";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r20028 r20033  
    10261026              else if (strcmp(name,"SealevelriseEustatic")==0) return SealevelriseEustaticEnum;
    10271027              else if (strcmp(name,"SealevelriseGElastic")==0) return SealevelriseGElasticEnum;
     1028              else if (strcmp(name,"SealevelriseDegacc")==0) return SealevelriseDegaccEnum;
    10281029              else if (strcmp(name,"MaximumNumberOfDefinitions")==0) return MaximumNumberOfDefinitionsEnum;
    10291030         else stage=10;
  • issm/trunk-jpl/src/c/shared/Numerics/legendre.cpp

    r20032 r20033  
    140140#include "./recast.h"
    141141
    142 IssmDouble* p_polynomial_value ( int m, int n, IssmDouble* x){
     142IssmDouble *p_polynomial_value ( int m, int n, IssmDouble* x){
    143143
    144144        /******************************************************************************{{{/
  • issm/trunk-jpl/src/m/classes/slr.m

    r20028 r20033  
    1515                elastic         = 0;
    1616                eustatic         = 0;
     17                degacc         = 0;
    1718        end
    1819        methods
     
    3839                self.elastic=1;
    3940                self.eustatic=1;
     41
     42                %numerical discretization accuracy
     43                self.degacc=.01;
    4044               
    4145                end % }}}
     
    4953                        md = checkfield(md,'fieldname','slr.abstol','size',[1 1]);
    5054                        md = checkfield(md,'fieldname','slr.maxiter','size',[1 1],'>=',1);
     55                        md = checkfield(md,'fieldname','slr.degacc','size',[1 1],'>=',1e-10);
    5156
    5257                        %check that love numbers are provided at the same level of accuracy:
     
    6873                        fielddisplay(self,'elastic','elastic earth graviational potential perturbation');
    6974                        fielddisplay(self,'eustatic','eustatic sea level rise');
     75                        fielddisplay(self,'degacc','accuracy (default .01 deg) for numerical discretization of the Green''s functions');
    7076
    7177                end % }}}
     
    8086                        WriteData(fid,'object',self,'class','sealevelrise','fieldname','elastic','format','Boolean');
    8187                        WriteData(fid,'object',self,'class','sealevelrise','fieldname','eustatic','format','Boolean');
     88                        WriteData(fid,'object',self,'class','sealevelrise','fieldname','degacc','format','Double');
    8289                end % }}}
    8390                function savemodeljs(self,fid,modelname) % {{{
     
    9198                        writejsdouble(fid,[modelname '.slr.rigid'],self.rigid);
    9299                        writejsdouble(fid,[modelname '.slr.eustatic'],self.eustatic);
     100                        writejsdouble(fid,[modelname '.slr.degacc'],self.degacc);
    93101
    94102                end % }}}
  • issm/trunk-jpl/src/m/enum/EnumDefinitions.js

    r20028 r20033  
    987987function SealevelriseEustaticEnum(){ return 983;}
    988988function SealevelriseGElasticEnum(){ return 984;}
    989 function MaximumNumberOfDefinitionsEnum(){ return 985;}
     989function SealevelriseDegaccEnum(){ return 985;}
     990function MaximumNumberOfDefinitionsEnum(){ return 986;}
  • issm/trunk-jpl/src/m/enum/EnumDefinitions.py

    r20028 r20033  
    994994def SealevelriseEustaticEnum(): return StringToEnum("SealevelriseEustatic")[0]
    995995def SealevelriseGElasticEnum(): return StringToEnum("SealevelriseGElastic")[0]
     996def SealevelriseDegaccEnum(): return StringToEnum("SealevelriseDegacc")[0]
    996997def MaximumNumberOfDefinitionsEnum(): return StringToEnum("MaximumNumberOfDefinitions")[0]
Note: See TracChangeset for help on using the changeset viewer.