Changeset 27691


Ignore:
Timestamp:
04/13/23 19:29:17 (2 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added averaging method for inputs

Location:
issm/trunk-jpl/src/c/classes/Inputs
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Inputs/Input.h

    r26121 r27691  
    4848                virtual void   Pow(IssmDouble scale_factor){_error_("Not implemented yet");};
    4949                virtual void   Scale(IssmDouble scale_factor){_error_("Not implemented yet");};
     50                virtual void   AverageAndReplace(void){_error_("Not implemented yet");};
    5051
    5152                virtual int  GetResultArraySize(void){_error_("Not implemented yet");};
  • issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp

    r27128 r27691  
    302302}
    303303/*}}}*/
    304 void     Inputs::Shift(int xenum, IssmDouble alpha){/*{{{*/
     304void Inputs::Shift(int xenum, IssmDouble alpha){/*{{{*/
    305305
    306306        _assert_(this);
     
    314314        /*Shift: */
    315315        this->inputs[index_x]->Shift(alpha);
     316}
     317/*}}}*/
     318void Inputs::AverageAndReplace(int inputenum){/*{{{*/
     319
     320        _assert_(this);
     321
     322        /*Get indices from enums*/
     323        int index = EnumToIndex(inputenum);
     324        if(!this->inputs[index]) _error_("Input "<<EnumToStringx(inputenum)<<" not found");
     325
     326        this->inputs[index]->AverageAndReplace();
    316327}
    317328/*}}}*/
  • issm/trunk-jpl/src/c/classes/Inputs/Inputs.h

    r27128 r27691  
    5050                void     AXPY(IssmDouble alpha, int xenum, int yenum);
    5151                void     Shift(int inputenum, IssmDouble alpha);
     52                void     AverageAndReplace(int inputenum);
    5253                void     DeepEcho(void);
    5354                void     DeepEcho(int enum_in);
  • issm/trunk-jpl/src/c/classes/Inputs/TriaInput.cpp

    r26121 r27691  
    406406}
    407407/*}}}*/
     408void TriaInput::AverageAndReplace(void){/*{{{*/
     409
     410        /*Get local sum and local size*/
     411        IssmDouble sum  = 0.;
     412        for(int i=0;i<this->M*this->N;i++) sum += this->values[i];
     413        sum = sum/(this->M*this->N);
     414
     415        /*Get sum across all procs*/
     416        IssmDouble all_sum;
     417        ISSM_MPI_Allreduce((void*)&sum,(void*)&all_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
     418
     419        /*Divide by number of procs*/
     420        int        num_procs = IssmComm::GetSize();
     421        IssmDouble newvalue = all_sum/num_procs;
     422
     423        /*Now replace existing input*/
     424        this->Reset(P0Enum);
     425        for(int i=0;i<this->M*this->N;i++) this->values[i] = newvalue;
     426}
     427/*}}}*/
    408428
    409429/*Object functions*/
  • issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h

    r26121 r27691  
    4141                void AXPY(Input* xinput,IssmDouble scalar);
    4242                void Shift(IssmDouble scalar);
     43                void AverageAndReplace(void);
    4344                void PointWiseMult(Input* xinput);
    4445                void Serve(int numindices,int* indices);
Note: See TracChangeset for help on using the changeset viewer.