Changeset 17100


Ignore:
Timestamp:
01/13/14 13:45:05 (11 years ago)
Author:
Mathieu Morlighem
Message:

NEW: added results as patch so that we can have nodal values

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

Legend:

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

    r17094 r17100  
    153153        return shelf;
    154154}/*}}}*/
    155 void Element::ResultInterpolation(int* pinterpolation,int output_enum){/*{{{*/
     155void Element::ResultInterpolation(int* pinterpolation,int* pnodesperelement,int output_enum){/*{{{*/
    156156
    157157        Input* input=this->inputs->GetInput(output_enum);
     
    194194
    195195        /*Assign output pointer*/
    196         *pinterpolation = input->GetResultInterpolation();
     196        *pinterpolation   = input->GetResultInterpolation();
     197        *pnodesperelement = input->GetResultNumberOfNodes();
    197198}/*}}}*/
    198199void Element::ResultToVector(Vector<IssmDouble>* vector,int output_enum){/*{{{*/
     
    242243        }
    243244} /*}}}*/
     245void Element::ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum){/*{{{*/
     246
     247        Input* input=this->inputs->GetInput(output_enum);
     248        if(!input) _error_("input "<<EnumToStringx(output_enum)<<" not found in element");
     249
     250        input->ResultToPatch(values,nodesperelement,this->Sid());
     251
     252} /*}}}*/
    244253IssmDouble Element::TMeltingPoint(IssmDouble pressure){/*{{{*/
    245254        _assert_(matpar);
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r17047 r17100  
    6565                void       GetVerticesConnectivityList(int* connectivitylist);
    6666                bool       IsFloating();
    67                 void       ResultInterpolation(int* pinterpolation,int output_enum);
     67                void       ResultInterpolation(int* pinterpolation,int*nodesperelement,int output_enum);
    6868                void       ResultToVector(Vector<IssmDouble>* vector,int output_enum);
     69                void       ResultToPatch(IssmDouble* values,int nodesperelement,int output_enum);
    6970                void       StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
    7071                void       StrainRateHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r17064 r17100  
    2222#include "../modules/ConfigureObjectsx/ConfigureObjectsx.h"
    2323#include "../modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.h"
    24 #include "../modules/OutputResultsx/OutputResultsx.h"
    2524#include "../modules/GetVectorFromInputsx/GetVectorFromInputsx.h"
    2625#include "../modules/InputUpdateFromVectorx/InputUpdateFromVectorx.h"
     
    471470
    472471        /*Intermediaries*/
    473         bool        isvec;
     472        bool        isvec,results_on_nodes;
    474473        int         step,output_enum;
    475474        IssmDouble  time;
     
    484483        parameters->FindParam(&step,StepEnum);
    485484        parameters->FindParam(&time,TimeEnum);
     485        parameters->FindParam(&results_on_nodes,SettingsResultsOnNodesEnum);
    486486
    487487        /*Go through all requested output*/
     
    541541
    542542                                        /*Vector layout*/
    543                                         int interpolation,size;
     543                                        int interpolation,nodesperelement,size;
    544544
    545545                                        /*Get interpolation (and compute input if necessary)*/
    546546                                        for(int j=0;j<elements->Size();j++){
    547547                                                Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(j));
    548                                                 element->ResultInterpolation(&interpolation,output_enum);
     548                                                element->ResultInterpolation(&interpolation,&nodesperelement,output_enum);
    549549                                        }
    550550
    551                                         /*Allocate vector depending on interpolation*/
    552                                         switch(interpolation){
    553                                                 case P0Enum: size = this->elements->NumberOfElements(); break;
    554                                                 case P1Enum: size = this->vertices->NumberOfVertices(); break;
    555                                                 default:     _error_("Interpolation "<<EnumToStringx(interpolation)<<" not supported yet");
     551                                        if(results_on_nodes){
     552
     553                                                /*Allocate matrices*/
     554                                                int         nbe       = this->elements->NumberOfElements();
     555                                                IssmDouble* values    = xNew<IssmDouble>(nbe*nodesperelement);
     556                                                IssmDouble* allvalues = xNew<IssmDouble>(nbe*nodesperelement);
     557
     558                                                /*Fill-in matrix*/
     559                                                for(int j=0;j<elements->Size();j++){
     560                                                        Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(j));
     561                                                        element->ResultToPatch(values,nodesperelement,output_enum);
     562                                                }
     563
     564                                                /*Gather from all cpus*/
     565                                                MPI_Allreduce((void*)values,(void*)allvalues,nbe*nodesperelement,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD);
     566                                                xDelete<IssmDouble>(values);
     567
     568                                                if(save_results)results->AddResult(new GenericExternalResult<IssmDouble*>(results->Size()+1,output_enum,allvalues,nbe,nodesperelement,step,time));
    556569
    557570                                        }
    558                                         Vector<IssmDouble> *vector_result = new Vector<IssmDouble>(size);
    559 
    560                                         /*Fill in vector*/
    561                                         for(int j=0;j<elements->Size();j++){
    562                                                 Element* element=(Element*)elements->GetObjectByOffset(j);
    563                                                 element->ResultToVector(vector_result,output_enum);
     571                                        else{
     572
     573                                                /*Allocate vector depending on interpolation*/
     574                                                switch(interpolation){
     575                                                        case P0Enum: size = this->elements->NumberOfElements(); break;
     576                                                        case P1Enum: size = this->vertices->NumberOfVertices(); break;
     577                                                        default:     _error_("Interpolation "<<EnumToStringx(interpolation)<<" not supported yet");
     578
     579                                                }
     580                                                Vector<IssmDouble> *vector_result = new Vector<IssmDouble>(size);
     581
     582                                                /*Fill in vector*/
     583                                                for(int j=0;j<elements->Size();j++){
     584                                                        Element* element=(Element*)elements->GetObjectByOffset(j);
     585                                                        element->ResultToVector(vector_result,output_enum);
     586                                                }
     587                                                vector_result->Assemble();
     588
     589                                                if(save_results)results->AddResult(new GenericExternalResult<Vector<IssmDouble>*>(results->Size()+1,output_enum,vector_result,step,time));
    564590                                        }
    565                                         vector_result->Assemble();
    566 
    567                                         if (save_results)results->AddResult(new GenericExternalResult<Vector<IssmDouble>*>(results->Size()+1,output_enum,vector_result,step,time));
    568591                                        isvec = true;
    569592                                        break;
  • issm/trunk-jpl/src/c/classes/Inputs/BoolInput.h

    r17094 r17100  
    3636                Input* PointwiseMax(Input* inputB){_error_("not implemented yet");};
    3737                int  GetResultInterpolation(void){return P0Enum;};
     38                int  GetResultNumberOfNodes(void){return 1;};
     39                void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");};
    3840                void Configure(Parameters* parameters);
    3941                void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");};
  • issm/trunk-jpl/src/c/classes/Inputs/ControlInput.cpp

    r16818 r17100  
    146146}
    147147/*}}}*/
     148/*FUNCTION ControlInput::GetResultNumberOfNodes{{{*/
     149int  ControlInput::GetResultNumberOfNodes(void){
     150
     151        return values->GetResultNumberOfNodes();
     152
     153}
     154/*}}}*/
    148155/*FUNCTION ControlInput::GetGradient{{{*/
    149156void ControlInput::GetGradient(Vector<IssmDouble>* gradient_vec,int* doflist){
  • issm/trunk-jpl/src/c/classes/Inputs/ControlInput.h

    r17094 r17100  
    7777                void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist);
    7878                int  GetResultInterpolation(void);
     79                int  GetResultNumberOfNodes(void);
     80                void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");};
    7981                void GetGradient(Vector<IssmDouble>* gradient_vec,int* doflist);
    8082                void ScaleGradient(IssmDouble scale);
  • issm/trunk-jpl/src/c/classes/Inputs/DatasetInput.h

    r17094 r17100  
    7272                void GetVectorFromInputs(Vector<IssmDouble>* vector,int* doflist){_error_("not implemented yet");};
    7373                int GetResultInterpolation(void){_error_("not implemented yet");};
     74                int GetResultNumberOfNodes(void){_error_("not implemented yet");};
     75                void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");};
    7476                void GetGradient(Vector<IssmDouble>* gradient_vec,int* doflist){_error_("not implemented yet");};
    7577                void ScaleGradient(IssmDouble scale){_error_("not implemented yet");};
  • issm/trunk-jpl/src/c/classes/Inputs/DoubleInput.h

    r17094 r17100  
    3939                Input* PointwiseMax(Input* inputB);
    4040                int  GetResultInterpolation(void){return P0Enum;};
     41                int  GetResultNumberOfNodes(void){return 1;};
     42                void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");};
    4143                void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");};
    4244                void Configure(Parameters* parameters);
  • issm/trunk-jpl/src/c/classes/Inputs/Input.h

    r17094 r17100  
    4646                virtual IssmDouble Max(void)=0;
    4747                virtual IssmDouble Min(void)=0;
    48                 virtual void Set(IssmDouble setvalue)=0;
     48                virtual void   Set(IssmDouble setvalue)=0;
    4949                virtual void   Scale(IssmDouble scale_factor)=0;
    5050                virtual void   AXPY(Input* xinput,IssmDouble scalar)=0;
     
    5959                virtual Input* PointwiseMax(Input* inputmax)=0;
    6060                virtual Input* PointwiseMin(Input* inputmin)=0;
    61                 virtual int GetResultInterpolation(void)=0;
     61                virtual int  GetResultInterpolation(void)=0;
     62                virtual int  GetResultNumberOfNodes(void)=0;
     63                virtual void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");};
    6264};
    6365#endif
  • issm/trunk-jpl/src/c/classes/Inputs/IntInput.h

    r17094 r17100  
    4040                Input* PointwiseMax(Input* inputB){_error_("not implemented yet");};
    4141                int  GetResultInterpolation(void){return P0Enum;};
     42                int  GetResultNumberOfNodes(void){return 1;};
     43                void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");};
    4244                void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");};
    4345                void Configure(Parameters* parameters);
  • issm/trunk-jpl/src/c/classes/Inputs/PentaInput.cpp

    r17094 r17100  
    135135}
    136136/*}}}*/
     137/*FUNCTION PentaInput::GetResultNumberOfNodes{{{*/
     138int  PentaInput::GetResultNumberOfNodes(void){
     139
     140        return this->NumberofNodes();;
     141
     142}
     143/*}}}*/
    137144
    138145/*Object functions*/
  • issm/trunk-jpl/src/c/classes/Inputs/PentaInput.h

    r17094 r17100  
    4040                Input* PointwiseMax(Input* inputB);
    4141                int  GetResultInterpolation(void);
     42                int  GetResultNumberOfNodes(void);
     43                void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");};
    4244                void AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");};
    4345                void Configure(Parameters* parameters);
  • issm/trunk-jpl/src/c/classes/Inputs/SegInput.h

    r17094 r17100  
    4040                Input* PointwiseMax(Input* inputB){_error_("not supported yet");};
    4141                int  GetResultInterpolation(void){_error_("not implemented");};
     42                int  GetResultNumberOfNodes(void){_error_("not implemented");};
     43                void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");};
    4244                void   AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");};
    4345                void   Configure(Parameters* parameters);
  • issm/trunk-jpl/src/c/classes/Inputs/TransientInput.cpp

    r16799 r17100  
    352352}
    353353/*}}}*/
     354/*FUNCTION TransientInput::GetResultNumberOfNodes{{{*/
     355int TransientInput::GetResultNumberOfNodes(void){
     356
     357        IssmDouble time;
     358        int        output;
     359
     360        parameters->FindParam(&time,TimeEnum);
     361        Input* input=GetTimeInput(time);
     362        output = input->GetResultNumberOfNodes();
     363
     364        /*Clean up and return*/
     365        delete input;
     366        return output;
     367
     368}
     369/*}}}*/
    354370/*FUNCTION TransientInput::Extrude{{{*/
    355371void TransientInput::Extrude(void){
  • issm/trunk-jpl/src/c/classes/Inputs/TransientInput.h

    r17094 r17100  
    4646                Input* PointwiseMax(Input* forcingB){_error_("not implemented yet");};
    4747                int  GetResultInterpolation(void);
     48                int  GetResultNumberOfNodes(void);
     49                void ResultToPatch(IssmDouble* values,int nodesperelement,int sid){_error_("not supported yet");};
    4850                void Configure(Parameters* parameters);
    4951                /*}}}*/
  • issm/trunk-jpl/src/c/classes/Inputs/TriaInput.cpp

    r17094 r17100  
    122122}
    123123/*}}}*/
     124/*FUNCTION TriaInput::GetResultNumberOfNodes{{{*/
     125int  TriaInput::GetResultNumberOfNodes(void){
     126
     127        return this->NumberofNodes();
     128
     129}
     130/*}}}*/
     131/*FUNCTION TriaInput::ResultToPatch{{{*/
     132void TriaInput::ResultToPatch(IssmDouble* values,int nodesperelement,int sid){
     133
     134        int numnodes = this->NumberofNodes();
     135
     136        /*Some checks*/
     137        _assert_(values);
     138        _assert_(numnodes==nodesperelement);
     139
     140        /*Fill in arrays*/
     141        for(int i=0;i<numnodes;i++){
     142                values[sid*numnodes + i] = this->values[i];
     143        }
     144
     145
     146
     147}
     148/*}}}*/
    124149
    125150/*Object functions*/
  • issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h

    r17094 r17100  
    4040                Input* PointwiseMax(Input* inputB);
    4141                int    GetResultInterpolation(void);
     42                int    GetResultNumberOfNodes(void);
     43                void   ResultToPatch(IssmDouble* values,int nodesperelement,int sid);
    4244                void   AddTimeValues(IssmDouble* values,int step,IssmDouble time){_error_("not supported yet");};
    4345                void   Configure(Parameters* parameters);
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r17085 r17100  
    6060        parameters->AddObject(iomodel->CopyConstantObject(MeshNumberofelementsEnum));
    6161        parameters->AddObject(iomodel->CopyConstantObject(MeshNumberofverticesEnum));
     62        parameters->AddObject(iomodel->CopyConstantObject(SettingsResultsOnNodesEnum));
    6263        parameters->AddObject(iomodel->CopyConstantObject(SettingsIoGatherEnum));
    6364        parameters->AddObject(iomodel->CopyConstantObject(GroundinglineMigrationEnum));
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r17098 r17100  
    233233        RiftsNumriftsEnum,
    234234        RiftsRiftstructEnum,
     235        SettingsResultsOnNodesEnum,
    235236        SettingsIoGatherEnum,
    236237        SettingsLowmemEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r17098 r17100  
    241241                case RiftsNumriftsEnum : return "RiftsNumrifts";
    242242                case RiftsRiftstructEnum : return "RiftsRiftstruct";
     243                case SettingsResultsOnNodesEnum : return "SettingsResultsOnNodes";
    243244                case SettingsIoGatherEnum : return "SettingsIoGather";
    244245                case SettingsLowmemEnum : return "SettingsLowmem";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r17098 r17100  
    244244              else if (strcmp(name,"RiftsNumrifts")==0) return RiftsNumriftsEnum;
    245245              else if (strcmp(name,"RiftsRiftstruct")==0) return RiftsRiftstructEnum;
     246              else if (strcmp(name,"SettingsResultsOnNodes")==0) return SettingsResultsOnNodesEnum;
    246247              else if (strcmp(name,"SettingsIoGather")==0) return SettingsIoGatherEnum;
    247248              else if (strcmp(name,"SettingsLowmem")==0) return SettingsLowmemEnum;
     
    259260              else if (strcmp(name,"Surface")==0) return SurfaceEnum;
    260261              else if (strcmp(name,"ThermalIsenthalpy")==0) return ThermalIsenthalpyEnum;
    261               else if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum;
    262262         else stage=3;
    263263   }
    264264   if(stage==3){
    265               if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum;
     265              if (strcmp(name,"ThermalIsdynamicbasalspc")==0) return ThermalIsdynamicbasalspcEnum;
     266              else if (strcmp(name,"ThermalMaxiter")==0) return ThermalMaxiterEnum;
    266267              else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum;
    267268              else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum;
     
    382383              else if (strcmp(name,"BoolInput")==0) return BoolInputEnum;
    383384              else if (strcmp(name,"BoolParam")==0) return BoolParamEnum;
    384               else if (strcmp(name,"Contour")==0) return ContourEnum;
    385385         else stage=4;
    386386   }
    387387   if(stage==4){
    388               if (strcmp(name,"ControlInput")==0) return ControlInputEnum;
     388              if (strcmp(name,"Contour")==0) return ContourEnum;
     389              else if (strcmp(name,"ControlInput")==0) return ControlInputEnum;
    389390              else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum;
    390391              else if (strcmp(name,"DoubleInput")==0) return DoubleInputEnum;
     
    505506              else if (strcmp(name,"ThicknessAbsGradient")==0) return ThicknessAbsGradientEnum;
    506507              else if (strcmp(name,"ThicknessAlongGradient")==0) return ThicknessAlongGradientEnum;
    507               else if (strcmp(name,"ThicknessAcrossGradient")==0) return ThicknessAcrossGradientEnum;
    508508         else stage=5;
    509509   }
    510510   if(stage==5){
    511               if (strcmp(name,"IntMatParam")==0) return IntMatParamEnum;
     511              if (strcmp(name,"ThicknessAcrossGradient")==0) return ThicknessAcrossGradientEnum;
     512              else if (strcmp(name,"IntMatParam")==0) return IntMatParamEnum;
    512513              else if (strcmp(name,"RheologyBbarAbsGradient")==0) return RheologyBbarAbsGradientEnum;
    513514              else if (strcmp(name,"DragCoefficientAbsGradient")==0) return DragCoefficientAbsGradientEnum;
     
    628629              else if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum;
    629630              else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum;
    630               else if (strcmp(name,"XY")==0) return XYEnum;
    631631         else stage=6;
    632632   }
    633633   if(stage==6){
    634               if (strcmp(name,"XYZ")==0) return XYZEnum;
     634              if (strcmp(name,"XY")==0) return XYEnum;
     635              else if (strcmp(name,"XYZ")==0) return XYZEnum;
    635636              else if (strcmp(name,"Dense")==0) return DenseEnum;
    636637              else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
  • issm/trunk-jpl/src/m/classes/settings.m

    r16764 r17100  
    66classdef settings
    77        properties (SetAccess=public)
     8                results_on_nodes    = 0;
    89                io_gather           = 0;
    910                lowmem              = 0;
     
    4950                function md = checkconsistency(obj,md,solution,analyses) % {{{
    5051
     52                        md = checkfield(md,'fieldname','settings.results_on_nodes','numel',[1],'values',[0 1]);
    5153                        md = checkfield(md,'fieldname','settings.io_gather','numel',[1],'values',[0 1]);
    5254                        md = checkfield(md,'fieldname','settings.lowmem','numel',[1],'values',[0 1]);
     
    5860                        disp(sprintf('   general settings parameters:'));
    5961
     62                        fielddisplay(obj,'results_on_nodes','results are output for all the nodes of each element');
    6063                        fielddisplay(obj,'io_gather','I/O gathering strategy for result outputs (default 1)');
    6164                        fielddisplay(obj,'lowmem','is the memory limited ? (0 or 1)');
     
    7073                end % }}}
    7174                function marshall(obj,md,fid) % {{{
     75                        WriteData(fid,'object',obj,'fieldname','results_on_nodes','format','Boolean');
    7276                        WriteData(fid,'object',obj,'fieldname','io_gather','format','Boolean');
    7377                        WriteData(fid,'object',obj,'fieldname','lowmem','format','Boolean');
  • issm/trunk-jpl/src/m/classes/settings.py

    r16764 r17100  
    1313
    1414        def __init__(self): # {{{
     15                self.results_on_nodes    = 0
    1516                self.io_gather           = 0
    1617                self.lowmem              = 0
     
    2526                string="   general settings parameters:"
    2627
     28                string="%s\n%s"%(string,fielddisplay(self,"results_on_nodes","results are output for all the nodes of each element"))
    2729                string="%s\n%s"%(string,fielddisplay(self,"io_gather","I/O gathering strategy for result outputs (default 1)"))
    2830                string="%s\n%s"%(string,fielddisplay(self,"lowmem","is the memory limited ? (0 or 1)"))
     
    5153        #}}}
    5254        def checkconsistency(self,md,solution,analyses):    # {{{
     55                md = checkfield(md,'fieldname','settings.results_on_nodes','numel',[1],'values',[0,1])
    5356                md = checkfield(md,'fieldname','settings.io_gather','numel',[1],'values',[0,1])
    5457                md = checkfield(md,'fieldname','settings.lowmem','numel',[1],'values',[0,1])
     
    5962        # }}}
    6063        def marshall(self,md,fid):    # {{{
     64                WriteData(fid,'object',self,'fieldname','results_on_nodes','format','Boolean')
    6165                WriteData(fid,'object',self,'fieldname','io_gather','format','Boolean')
    6266                WriteData(fid,'object',self,'fieldname','lowmem','format','Boolean')
  • issm/trunk-jpl/src/m/enum/EnumDefinitions.py

    r17098 r17100  
    233233def RiftsNumriftsEnum(): return StringToEnum("RiftsNumrifts")[0]
    234234def RiftsRiftstructEnum(): return StringToEnum("RiftsRiftstruct")[0]
     235def SettingsResultsOnNodesEnum(): return StringToEnum("SettingsResultsOnNodes")[0]
    235236def SettingsIoGatherEnum(): return StringToEnum("SettingsIoGather")[0]
    236237def SettingsLowmemEnum(): return StringToEnum("SettingsLowmem")[0]
Note: See TracChangeset for help on using the changeset viewer.