Changeset 10989


Ignore:
Timestamp:
11/30/11 14:50:38 (13 years ago)
Author:
Mathieu Morlighem
Message:

Fixed many bugs in OutputResult for results_as_patches = 0

Location:
issm/trunk-jpl/src/c
Files:
19 edited

Legend:

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

    r10975 r10989  
    164164/*}}}*/
    165165/*FUNCTION Elements::ToResults{{{1*/
    166 void Elements::ToResults(Results* results,Parameters* parameters,int step, double time){
     166void Elements::ToResults(Results* results,Parameters* parameters){
    167167
    168168        extern int my_rank;
     
    170170        Patch  *patch        = NULL;
    171171        int    *resultsenums = NULL;
     172        int    *resultssize  = NULL;
     173        int    *resultsstep  = NULL;
     174        double *resultstimes = NULL;
    172175        double *vector_serial= NULL;
    173176        Vec     vector       = NULL;
    174177        bool   io_gather;
    175178        bool   results_as_patches;
    176         int    numberofvertices;
    177         int    numberofresults;
     179        int    numberofvertices,numberofelements;
     180        int    numberofresults,vectorsize;
    178181
    179182        /*Recover parameters: */
     
    181184        parameters->FindParam(&results_as_patches,SettingsResultsAsPatchesEnum);
    182185        parameters->FindParam(&numberofvertices,MeshNumberofverticesEnum);
     186        parameters->FindParam(&numberofelements,MeshNumberofelementsEnum);
    183187
    184188        if(!results_as_patches){
     
    187191                /*OK, see what the first element of this partition has in stock (this is common to all partitions)*/
    188192                Element* element=(Element*)this->GetObjectByOffset(0);
    189                 element->ListResultsEnums(&resultsenums,&numberofresults);
     193                element->ListResultsInfo(&resultsenums,&resultssize,&resultstimes,&resultsstep,&numberofresults);
    190194
    191195                /*Loop over all results and get nodal vector*/
     
    193197
    194198                        /*Get vector for result number i*/
    195                         vector=NewVec(numberofvertices);
     199                        if(resultssize[i]==P1Enum)      vectorsize=numberofvertices;
     200                        else if(resultssize[i]==P0Enum) vectorsize=numberofelements;
     201                        else _error_("Unkown result size: %s",EnumToStringx(resultssize[i]));
     202                        vector=NewVec(vectorsize);
     203
    196204                        for(int j=0;j<this->Size();j++){
    197205                                Element* element=(Element*)this->GetObjectByOffset(j);
    198                                 element->GetVectorFromResults(vector,resultsenums[i]);
     206                                element->GetVectorFromResults(vector,i);
    199207                        }
    200208                        VecAssemblyBegin(vector);
     
    205213                        if(my_rank==0){
    206214                                /*No need to add this vector for all cpus*/
    207                                 results->AddObject(new DoubleVecExternalResult(results->Size()+1,resultsenums[i],vector_serial,numberofvertices,step,time));
     215                                results->AddObject(new DoubleVecExternalResult(results->Size()+1,resultsenums[i],vector_serial,vectorsize,resultsstep[i],resultstimes[i]));
    208216                        }
    209217
     
    224232                /*create result object and add to results dataset:*/
    225233                if (patch->maxvertices && patch->maxnodes){
    226                         results->AddObject(new IntExternalResult(results->Size()+1,PatchVerticesEnum,patch->maxvertices,step,time));
    227                         results->AddObject(new IntExternalResult(results->Size()+1,PatchNodesEnum,   patch->maxnodes,step,time));
    228                         results->AddObject(new DoubleMatExternalResult(results->Size()+1,PatchEnum,patch->values,patch->numrows,patch->numcols,step,time));
     234                        results->AddObject(new IntExternalResult(results->Size()+1,PatchVerticesEnum,patch->maxvertices,1,0));
     235                        results->AddObject(new IntExternalResult(results->Size()+1,PatchNodesEnum,   patch->maxnodes,1,0));
     236                        results->AddObject(new DoubleMatExternalResult(results->Size()+1,PatchEnum,  patch->values,patch->numrows,patch->numcols,1,0));
    229237                }
    230238        }
     
    232240        /*Free ressources:*/
    233241        xfree((void**)&resultsenums);
     242        xfree((void**)&resultssize);
     243        xfree((void**)&resultstimes);
     244        xfree((void**)&resultsstep);
    234245        delete patch;
    235246}
  • issm/trunk-jpl/src/c/Container/Elements.h

    r10522 r10989  
    3030                void ProcessResultsUnits(void);
    3131                void SetCurrentConfiguration(Elements* elements,Loads* loads, Nodes* nodes, Vertices* vertices, Materials* materials,Parameters* parameters);
    32                 void ToResults(Results* results,Parameters* parameters,int step, double time);
     32                void ToResults(Results* results,Parameters* parameters);
    3333                Patch* ResultsToPatch(void);
    3434                int   NumberOfElements(void);
  • issm/trunk-jpl/src/c/Container/Results.cpp

    r10522 r10989  
    136136
    137137        /*Fill each field: */
    138         for(i=0;i<nfields-2;i++){ //do not include the last one used for time
     138        for(i=0;i<this->Size();i++){ //do not include the last one used for time
    139139                ExternalResult* result=(ExternalResult*)this->GetObjectByOffset(i);
    140140                result->SetMatlabField(dataref);
  • issm/trunk-jpl/src/c/modules/OutputResultsx/OutputResultsx.cpp

    r10400 r10989  
    1717               
    1818#ifdef _SERIAL_
    19 void OutputResultsx(mxArray** pdataref, Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Results** presults, int step, double time){
     19void OutputResultsx(mxArray** pdataref, Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Results** presults){
    2020#else
    21 void OutputResultsx(                    Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Results** presults, int step, double time){
     21void OutputResultsx(                    Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Results** presults){
    2222#endif
    2323
     
    5454        /*We have results inside our elements, loads, etc ... Get them out of there, into the results dataset: */
    5555        elements->ProcessResultsUnits();
    56         elements->ToResults(results,parameters,step,time);
     56        elements->ToResults(results,parameters);
    5757        elements->DeleteResults();
    5858
  • issm/trunk-jpl/src/c/modules/OutputResultsx/OutputResultsx.h

    r9320 r10989  
    1616#ifdef _SERIAL_
    1717#include <mex.h>
    18 void OutputResultsx(mxArray** pdataref, Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads,  Materials* materials, Parameters* parameters, Results** presults,int step=1,double time=0);
     18void OutputResultsx(mxArray** pdataref, Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads,  Materials* materials, Parameters* parameters, Results** presults);
    1919#else
    20 void OutputResultsx(Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads,  Materials* materials, Parameters* parameters, Results** presults,int step=1,double time=0);
     20void OutputResultsx(Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads,  Materials* materials, Parameters* parameters, Results** presults);
    2121#endif
    2222
  • issm/trunk-jpl/src/c/objects/ElementResults/BoolElementResult.h

    r9883 r10989  
    4545                /*ElementResult virtual functions definitions: {{{1*/
    4646                ElementResult* SpawnTriaElementResult(int* indices);
     47                double  GetTime(void){return time;};
     48                int     GetStep(void){return step;};
    4749                void    ProcessUnits(Parameters* parameters);
    4850                int     NumberOfNodalValues(void);
  • issm/trunk-jpl/src/c/objects/ElementResults/DoubleElementResult.h

    r9883 r10989  
    4545                /*ElementResult virtual functions definitions: {{{1*/
    4646                ElementResult* SpawnTriaElementResult(int* indices);
     47                double  GetTime(void){return time;};
     48                int     GetStep(void){return step;};
    4749                void    ProcessUnits(Parameters* parameters);
    4850                int     NumberOfNodalValues(void);
  • issm/trunk-jpl/src/c/objects/ElementResults/ElementResult.h

    r9883 r10989  
    1919               
    2020                virtual         ElementResult* SpawnTriaElementResult(int* indices)=0;
     21                virtual double  GetTime(void)=0;
     22                virtual int     GetStep(void)=0;
    2123                virtual void    ProcessUnits(Parameters* parameters)=0;
    2224                virtual int     NumberOfNodalValues(void)=0;
  • issm/trunk-jpl/src/c/objects/ElementResults/PentaVertexElementResult.h

    r9883 r10989  
    4444                /*ElementResult virtual functions definitions: {{{1*/
    4545                ElementResult* SpawnTriaElementResult(int* indices);
     46                double  GetTime(void){return time;};
     47                int     GetStep(void){return step;};
    4648                void    ProcessUnits(Parameters* parameters);
    4749                int     NumberOfNodalValues(void);
  • issm/trunk-jpl/src/c/objects/ElementResults/TriaVertexElementResult.h

    r9883 r10989  
    4343                /*ElementResult virtual functions definitions: {{{1*/
    4444                ElementResult* SpawnTriaElementResult(int* indices);
     45                double  GetTime(void){return time;};
     46                int     GetStep(void){return step;};
    4547                void    ProcessUnits(Parameters* parameters);
    4648                int     NumberOfNodalValues(void);
  • issm/trunk-jpl/src/c/objects/Elements/Element.h

    r10703 r10989  
    4747                virtual void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes)=0;
    4848                virtual void   PatchFill(int* pcount, Patch* patch)=0;
    49                 virtual void   ListResultsEnums(int** results_enums,int* num_results)=0;
     49                virtual void   ListResultsInfo(int** results_enums,int** results_size,double** results_times,int** results_steps,int* num_results)=0;
    5050                virtual void   DeleteResults(void)=0;
    5151                virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type)=0;
     
    5959                virtual void   InputScale(int enum_type,double scale_factor)=0;
    6060                virtual void   GetVectorFromInputs(Vec vector, int name_enum)=0;
    61                 virtual void   GetVectorFromResults(Vec vector,int name_enum)=0;
     61                virtual void   GetVectorFromResults(Vec vector,int id)=0;
    6262                virtual void   InputArtificialNoise(int enum_type,double min,double max)=0;
    6363                virtual bool   InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums)=0;
  • issm/trunk-jpl/src/c/objects/Elements/Penta.cpp

    r10970 r10989  
    11391139/*}}}*/
    11401140/*FUNCTION Penta::GetVectorFromResults{{{1*/
    1141 void  Penta::GetVectorFromResults(Vec vector,int result_enum){
     1141void  Penta::GetVectorFromResults(Vec vector,int offset){
    11421142
    11431143        int doflist1[NUMVERTICES];
     
    11461146        this->GetSidList(&doflist1[0]);
    11471147
    1148         /*Get result)*/
    1149         for(int i=0;i<this->results->Size();i++){
    1150                 ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
    1151                 if(elementresult->InstanceEnum()!=result_enum) continue;
    1152                 elementresult->GetVectorFromResults(vector,&doflist1[0],NUMVERTICES);
    1153                 return;
    1154         }
    1155 
    1156         _error_("Result %s not found in element",EnumToStringx(result_enum));
     1148        /*Get result*/
     1149        ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(offset);
     1150        elementresult->GetVectorFromResults(vector,&doflist1[0],NUMVERTICES);
    11571151}
    11581152/*}}}*/
     
    20572051}
    20582052/*}}}*/
    2059 /*FUNCTION Penta::ListResultsEnums{{{*/
    2060 void Penta::ListResultsEnums(int** in_results_enums,int* in_num_results){
     2053/*FUNCTION Penta::ListResultsInfo{{{*/
     2054void Penta::ListResultsInfo(int** in_resultsenums,int** in_resultssizes,double** in_resultstimes,int** in_resultssteps,int* in_num_results){
    20612055
    20622056        /*Intermediaries*/
     
    20642058        int     numberofresults = 0;
    20652059        int     *resultsenums   = NULL;
     2060        int     *resultssizes   = NULL;
     2061        double  *resultstimes   = NULL;
     2062        int     *resultssteps   = NULL;
    20662063
    20672064        /*Checks*/
     
    20782075                /*Allocate output*/
    20792076                resultsenums=(int*)xmalloc(numberofresults*sizeof(int));
     2077                resultssizes=(int*)xmalloc(numberofresults*sizeof(int));
     2078                resultstimes=(double*)xmalloc(numberofresults*sizeof(double));
     2079                resultssteps=(int*)xmalloc(numberofresults*sizeof(int));
    20802080
    20812081                /*populate enums*/
     
    20832083                        ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
    20842084                        resultsenums[i]=elementresult->InstanceEnum();
     2085                        resultstimes[i]=elementresult->GetTime();
     2086                        resultssteps[i]=elementresult->GetStep();
     2087                        if(elementresult->ObjectEnum()==PentaVertexElementResultEnum){
     2088                                resultssizes[i]=P1Enum;
     2089                        }
     2090                        else{
     2091                                resultssizes[i]=P0Enum;
     2092                        }
    20852093                }
    20862094        }
     
    20882096        /*Assign output pointers:*/
    20892097        *in_num_results=numberofresults;
    2090         *in_results_enums=resultsenums;
     2098        *in_resultsenums=resultsenums;
     2099        *in_resultssizes=resultssizes;
     2100        *in_resultstimes=resultstimes;
     2101        *in_resultssteps=resultssteps;
    20912102
    20922103}/*}}}*/
  • issm/trunk-jpl/src/c/objects/Elements/Penta.h

    r10703 r10989  
    9292                double GetZcoord(GaussPenta* gauss);
    9393                void   GetVectorFromInputs(Vec vector,int name_enum);
    94                 void   GetVectorFromResults(Vec vector,int name_enum);
     94                void   GetVectorFromResults(Vec vector,int offset);
    9595               
    9696                int    Sid();
     
    107107                void   PotentialSheetUngrounding(Vec potential_sheet_ungrounding);
    108108                void   RequestedOutput(int output_enum,int step,double time);
    109                 void   ListResultsEnums(int** results_enums,int* num_results);
     109                void   ListResultsInfo(int** results_enums,int** results_size,double** results_times,int** results_steps,int* num_results);
    110110                void   PatchFill(int* pcount, Patch* patch);
    111111                void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes);
  • issm/trunk-jpl/src/c/objects/Elements/Tria.cpp

    r10970 r10989  
    12541254/*}}}*/
    12551255/*FUNCTION Tria::GetVectorFromResults{{{1*/
    1256 void  Tria::GetVectorFromResults(Vec vector,int result_enum){
    1257 
    1258         bool found=false;
     1256void  Tria::GetVectorFromResults(Vec vector,int offset){
     1257
    12591258        int doflist1[NUMVERTICES];
    12601259
     
    12621261        this->GetSidList(&doflist1[0]);
    12631262
    1264         /*Get result)*/
    1265         for(int i=0;i<this->results->Size();i++){
    1266                 ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
    1267                 if(elementresult->InstanceEnum()!=result_enum) continue;
    1268                 elementresult->GetVectorFromResults(vector,&doflist1[0],NUMVERTICES);
    1269                 return;
    1270         }
    1271 
    1272         _error_("Result %s not found in element",EnumToStringx(result_enum));
     1263        /*Get result*/
     1264        ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(offset);
     1265        elementresult->GetVectorFromResults(vector,&doflist1[0],NUMVERTICES);
    12731266}
    12741267/*}}}*/
     
    18971890}
    18981891/*}}}*/
    1899 /*FUNCTION Tria::ListResultsEnums{{{*/
    1900 void Tria::ListResultsEnums(int** in_results_enums,int* in_num_results){
     1892/*FUNCTION Tria::ListResultsInfo{{{*/
     1893void Tria::ListResultsInfo(int** in_resultsenums,int** in_resultssizes,double** in_resultstimes,int** in_resultssteps,int* in_num_results){
    19011894
    19021895        /*Intermediaries*/
     
    19041897        int     numberofresults = 0;
    19051898        int     *resultsenums   = NULL;
     1899        int     *resultssizes   = NULL;
     1900        double  *resultstimes   = NULL;
     1901        int     *resultssteps   = NULL;
    19061902
    19071903        /*Checks*/
     
    19181914                /*Allocate output*/
    19191915                resultsenums=(int*)xmalloc(numberofresults*sizeof(int));
     1916                resultssizes=(int*)xmalloc(numberofresults*sizeof(int));
     1917                resultstimes=(double*)xmalloc(numberofresults*sizeof(double));
     1918                resultssteps=(int*)xmalloc(numberofresults*sizeof(int));
    19201919
    19211920                /*populate enums*/
     
    19231922                        ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
    19241923                        resultsenums[i]=elementresult->InstanceEnum();
     1924                        resultstimes[i]=elementresult->GetTime();
     1925                        resultssteps[i]=elementresult->GetStep();
     1926                        if(elementresult->ObjectEnum()==TriaVertexElementResultEnum){
     1927                                resultssizes[i]=P1Enum;
     1928                        }
     1929                        else{
     1930                                resultssizes[i]=P0Enum;
     1931                        }
    19251932                }
    19261933        }
     
    19281935        /*Assign output pointers:*/
    19291936        *in_num_results=numberofresults;
    1930         *in_results_enums=resultsenums;
     1937        *in_resultsenums=resultsenums;
     1938        *in_resultssizes=resultssizes;
     1939        *in_resultstimes=resultstimes;
     1940        *in_resultssteps=resultssteps;
    19311941
    19321942}/*}}}*/
  • issm/trunk-jpl/src/c/objects/Elements/Tria.h

    r10703 r10989  
    9292                void   GetSolutionFromInputs(Vec solution);
    9393                void   GetVectorFromInputs(Vec vector, int name_enum);
    94                 void   GetVectorFromResults(Vec vector,int name_enum);
     94                void   GetVectorFromResults(Vec vector,int offset);
    9595                void   InputArtificialNoise(int enum_type,double min, double max);
    9696                bool   InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums);
     
    106106                void   PotentialSheetUngrounding(Vec potential_sheet_ungrounding);
    107107                void   RequestedOutput(int output_enum,int step,double time);
    108                 void   ListResultsEnums(int** results_enums,int* num_results);
     108                void   ListResultsInfo(int** results_enums,int** results_size,double** results_times,int** results_steps,int* num_results);
    109109                void   PatchFill(int* pcount, Patch* patch);
    110110                void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes);
  • issm/trunk-jpl/src/c/objects/ExternalResults/DoubleVecExternalResult.cpp

    r9883 r10989  
    209209void DoubleVecExternalResult::SetMatlabField(mxArray* dataref){
    210210
    211         mxArray* pfield=NULL;
    212         double* doublemat=NULL;
    213         char* name=NULL;
    214         double* doublevec=NULL;
     211        mxArray *pfield    = NULL;
     212        double  *doublemat = NULL;
     213        char    *name      = NULL;
     214        double  *doublevec = NULL;
    215215
    216216        /*Make a copy of the value, to be used by matlab: */
     
    230230        mxSetField( dataref, this->step-1, "time",mxCreateDoubleScalar((double)this->time));
    231231        mxSetField( dataref, this->step-1, "step",mxCreateDoubleScalar((double)this->step));
    232 
    233232}
    234233#endif
  • issm/trunk-jpl/src/c/solutions/hydrology_core.cpp

    r10534 r10989  
    6161                        /*unload results*/
    6262                        _printf_(VerboseSolution(),"   saving temporary results\n");
    63                         OutputResultsx(femmodel->elements, femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,&femmodel->results,i+1,time);
     63                        OutputResultsx(femmodel->elements, femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,&femmodel->results);
    6464
    6565                }
  • issm/trunk-jpl/src/c/solutions/thermal_core.cpp

    r10988 r10989  
    6060                        InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,TemperatureEnum,i+1,time);
    6161                        InputToResultx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,BasalforcingsMeltingRateEnum,i+1,time);
    62 
    63                         /*unload results*/
    64                         _printf_(VerboseSolution(),"   saving temporary results\n");
    65                         OutputResultsx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,&femmodel->results,i+1,time);
    6662                }
    6763
  • issm/trunk-jpl/src/c/solutions/transient_core.cpp

    r10650 r10989  
    141141                        /*unload results*/
    142142                        _printf_(VerboseSolution(),"   saving temporary results\n");
    143                         OutputResultsx(femmodel->elements, femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,&femmodel->results,step,time);
     143                        OutputResultsx(femmodel->elements, femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,&femmodel->results);
    144144                }
    145145        }
Note: See TracChangeset for help on using the changeset viewer.