Changeset 9874


Ignore:
Timestamp:
09/21/11 16:43:20 (13 years ago)
Author:
Mathieu Morlighem
Message:

Added support for result_on_vertices

Location:
issm/trunk/src/c
Files:
14 edited

Legend:

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

    r9622 r9874  
    171171void Elements::ToResults(Results* results,Parameters* parameters,int step, double time){
    172172
    173         Patch* patch=NULL;
     173        Patch  *patch        = NULL;
     174        int    *resultsenums = NULL;
     175        double *vector_serial= NULL;
     176        Vec     vector       = NULL;
    174177        bool   io_gather;
     178        bool   results_on_vertices;
     179        int    numberofvertices;
     180        int    numberofresults;
    175181
    176182        /*Recover parameters: */
    177183        parameters->FindParam(&io_gather,SettingsIoGatherEnum);
    178 
    179         /*create patch object out of all results in this dataset: */
    180         patch=this->ResultsToPatch();
    181 
    182         /*Gather onto master cpu 0, if needed: */
     184        parameters->FindParam(&results_on_vertices,SettingsResultsOnVerticesEnum);
     185        parameters->FindParam(&numberofvertices,MeshNumberofverticesEnum);
     186
     187        if(results_on_vertices){
     188                /*No patch here, we prepare vectors*/
     189
     190                /*OK, see what the first element of this partition has in stock (this is common to all partitions)*/
     191                Element* element=(Element*)this->GetObjectByOffset(0);
     192                element->ListResultsEnums(&resultsenums,&numberofresults);
     193
     194                /*Loop over all results and get nodal vector*/
     195                for(int i=0;i<numberofresults;i++){
     196
     197                        /*Get vector for result number i*/
     198                        vector=NewVec(numberofvertices);
     199                        for(int j=0;j<this->Size();j++){
     200                                Element* element=(Element*)this->GetObjectByOffset(j);
     201                                element->GetVectorFromResults(vector,resultsenums[i]);
     202                        }
     203                        VecAssemblyBegin(vector);
     204                        VecAssemblyEnd(vector);
     205
     206                        /*Serialize and add to results*/
     207                        VecToMPISerial(&vector_serial,vector);
     208                        results->AddObject(new DoubleVecExternalResult(results->Size()+1,resultsenums[i],vector_serial,numberofvertices,step,time));
     209
     210                        /*clean up*/
     211                        VecFree(&vector);
     212                        xfree((void**)&vector_serial);
     213                }
     214
     215        }
     216        else{
     217                /*create patch object out of all results in this dataset: */
     218                patch=this->ResultsToPatch();
     219
     220                /*Gather onto master cpu 0, if needed: */
    183221#ifdef _PARALLEL_
    184         if(io_gather)patch->Gather();
     222                if(io_gather)patch->Gather();
    185223#endif
    186224
    187         /*create result object and add to results dataset:*/
    188         if (patch->maxvertices && patch->maxnodes){
    189                 results->AddObject(new IntExternalResult(results->Size()+1,PatchVerticesEnum,patch->maxvertices,step,time));
    190                 results->AddObject(new IntExternalResult(results->Size()+1,PatchNodesEnum,   patch->maxnodes,step,time));
    191                 results->AddObject(new DoubleMatExternalResult(results->Size()+1,PatchEnum,patch->values,patch->numrows,patch->numcols,step,time));
     225                /*create result object and add to results dataset:*/
     226                if (patch->maxvertices && patch->maxnodes){
     227                        results->AddObject(new IntExternalResult(results->Size()+1,PatchVerticesEnum,patch->maxvertices,step,time));
     228                        results->AddObject(new IntExternalResult(results->Size()+1,PatchNodesEnum,   patch->maxnodes,step,time));
     229                        results->AddObject(new DoubleMatExternalResult(results->Size()+1,PatchEnum,patch->values,patch->numrows,patch->numcols,step,time));
     230                }
    192231        }
    193232
    194233        /*Free ressources:*/
     234        xfree((void**)&resultsenums);
    195235        delete patch;
    196236}
  • issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r9851 r9874  
    6969        parameters->AddObject(iomodel->CopyConstantObject(SettingsWaitonlockEnum));
    7070        parameters->AddObject(iomodel->CopyConstantObject(MeshNumberofelementsEnum));
     71        parameters->AddObject(iomodel->CopyConstantObject(MeshNumberofverticesEnum));
    7172        parameters->AddObject(iomodel->CopyConstantObject(SettingsIoGatherEnum));
     73        parameters->AddObject(iomodel->CopyConstantObject(SettingsResultsOnVerticesEnum));
    7274        parameters->AddObject(iomodel->CopyConstantObject(GroundinglineMigrationEnum));
    7375        parameters->AddObject(iomodel->CopyConstantObject(TransientIsdiagnosticEnum));
  • issm/trunk/src/c/modules/OutputResultsx/OutputResultsx.cpp

    r9650 r9874  
    1818#ifdef _SERIAL_
    1919void OutputResultsx(mxArray** pdataref, Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Results** presults, int step, double time){
    20 #else                                                                                                                                                                                            
     20#else
    2121void OutputResultsx(                    Elements* elements, Nodes* nodes, Vertices* vertices, Loads* loads, Materials* materials, Parameters* parameters,Results** presults, int step, double time){
    2222#endif
  • issm/trunk/src/c/objects/ElementResults/ElementResult.h

    r5529 r9874  
    2222                virtual int     NumberOfNodalValues(void)=0;
    2323                virtual void    PatchFill(int row, Patch* patch)=0;
     24                virtual int     EnumType()=0;
    2425
    2526};
  • issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp

    r9777 r9874  
    194194}
    195195/*}}}*/
     196/*FUNCTION PentaVertexElementResult::GetVectorFromResults{{{1*/
     197void PentaVertexElementResult::GetVectorFromResults(Vec vector,int* doflist){
     198
     199        const int numvertices=6;
     200        VecSetValues(vector,numvertices,doflist,(const double*)this->values,INSERT_VALUES);
     201
     202} /*}}}*/
  • issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.h

    r9777 r9874  
    5050                /*PentaVertexElementResult management: {{{1*/
    5151                int   EnumType();
     52                void GetVectorFromResults(Vec vector,int* doflist);
    5253                /*}}}*/
    5354
  • issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp

    r9777 r9874  
    183183}
    184184/*}}}*/
     185/*FUNCTION TriaVertexElementResult::GetVectorFromResults{{{1*/
     186void TriaVertexElementResult::GetVectorFromResults(Vec vector,int* doflist){
     187
     188        const int numvertices=3;
     189        VecSetValues(vector,numvertices,doflist,(const double*)this->values,INSERT_VALUES);
     190
     191} /*}}}*/
  • issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.h

    r9777 r9874  
    4949                /*TriaVertexElementResult management: {{{1*/
    5050                int   EnumType();
     51                void GetVectorFromResults(Vec vector,int* doflist);
    5152                /*}}}*/
    5253
  • issm/trunk/src/c/objects/Elements/Element.h

    r9817 r9874  
    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;
    4950                virtual void   DeleteResults(void)=0;
    5051                virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type)=0;
     
    5758               
    5859                virtual void   InputScale(int enum_type,double scale_factor)=0;
    59                 virtual void   GetVectorFromInputs(Vec vector,int NameEnum)=0;
     60                virtual void   GetVectorFromInputs(Vec vector, int name_enum)=0;
     61                virtual void   GetVectorFromResults(Vec vector,int name_enum)=0;
    6062                virtual void   InputArtificialNoise(int enum_type,double min,double max)=0;
    6163                virtual bool   InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums)=0;
  • issm/trunk/src/c/objects/Elements/Penta.cpp

    r9817 r9874  
    11261126}
    11271127/*}}}*/
     1128/*FUNCTION Penta::GetVectorFromResults{{{1*/
     1129void  Penta::GetVectorFromResults(Vec vector,int result_enum){
     1130
     1131        bool found=false;
     1132        int doflist1[NUMVERTICES];
     1133
     1134        /*Prepare index list*/
     1135        this->GetSidList(&doflist1[0]);
     1136
     1137        /*Get result)*/
     1138        for(int i=0;i<this->results->Size();i++){
     1139                ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
     1140                if(elementresult->EnumType()!=result_enum) continue;
     1141                if(elementresult->Enum()    !=PentaVertexElementResultEnum) _error_("Result %s found but is not of class PentaVertexElementResultEnum");
     1142
     1143                found=true;
     1144                PentaVertexElementResult* result=(PentaVertexElementResult*)elementresult;
     1145                result->GetVectorFromResults(vector,&doflist1[0]);
     1146        }
     1147}
     1148/*}}}*/
    11281149/*FUNCTION Penta::GetZcoord {{{1*/
    11291150double Penta::GetZcoord(GaussPenta* gauss){
     
    20012022}
    20022023/*}}}*/
     2024/*FUNCTION Penta::ListResultsEnums{{{*/
     2025void Penta::ListResultsEnums(int** in_results_enums,int* in_num_results){
     2026
     2027        /*Intermediaries*/
     2028        int     i;
     2029        int     numberofresults = 0;
     2030        int     *resultsenums =NULL;
     2031
     2032        /*Checks*/
     2033        _assert_(in_num_results);
     2034
     2035        /*Count number of results*/
     2036        for(i=0;i<this->results->Size();i++){
     2037                ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
     2038                numberofresults++;
     2039        }
     2040
     2041        /*Allocate output*/
     2042        resultsenums=(int*)xmalloc(numberofresults*sizeof(int));
     2043
     2044        /*populate enums*/
     2045        for(i=0;i<this->results->Size();i++){
     2046                ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
     2047                resultsenums[i]=elementresult->EnumType();
     2048        }
     2049
     2050        /*Assign output pointers:*/
     2051        *in_num_results=numberofresults;
     2052        *in_results_enums=resultsenums;
     2053
     2054}/*}}}*/
    20032055/*FUNCTION Penta::MigrateGroundingLine{{{1*/
    20042056void  Penta::MigrateGroundingLine(void){
  • issm/trunk/src/c/objects/Elements/Penta.h

    r9817 r9874  
    9191                double GetZcoord(GaussPenta* gauss);
    9292                void   GetVectorFromInputs(Vec vector,int NameEnum);
     93                void   GetVectorFromResults(Vec vector,int name_enum);
    9394               
    9495                int    Sid();
     
    107108                void   ShelfSync();
    108109                void   RequestedOutput(int output_enum,int step,double time);
     110                void   ListResultsEnums(int** results_enums,int* num_results);
    109111                void   MigrateGroundingLine();
    110112                void   PatchFill(int* pcount, Patch* patch);
  • issm/trunk/src/c/objects/Elements/Tria.cpp

    r9843 r9874  
    13051305        /*We found the enum.  Use its values to fill into the vector, using the vertices ids: */
    13061306        input->GetVectorFromInputs(vector,&doflist1[0]);
     1307}
     1308/*}}}*/
     1309/*FUNCTION Tria::GetVectorFromResults{{{1*/
     1310void  Tria::GetVectorFromResults(Vec vector,int result_enum){
     1311
     1312        bool found=false;
     1313        int doflist1[NUMVERTICES];
     1314
     1315        /*Prepare index list*/
     1316        this->GetSidList(&doflist1[0]);
     1317
     1318        /*Get result)*/
     1319        for(int i=0;i<this->results->Size();i++){
     1320                ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
     1321                if(elementresult->EnumType()!=result_enum) continue;
     1322                if(elementresult->Enum()    !=TriaVertexElementResultEnum) _error_("Result %s found but is not of class TriaVertexElementResultEnum");
     1323
     1324                found=true;
     1325                TriaVertexElementResult* result=(TriaVertexElementResult*)elementresult;
     1326                result->GetVectorFromResults(vector,&doflist1[0]);
     1327        }
    13071328}
    13081329/*}}}*/
     
    19261947}
    19271948/*}}}*/
     1949/*FUNCTION Tria::ListResultsEnums{{{*/
     1950void Tria::ListResultsEnums(int** in_results_enums,int* in_num_results){
     1951
     1952        /*Intermediaries*/
     1953        int     i;
     1954        int     numberofresults = 0;
     1955        int     *resultsenums =NULL;
     1956
     1957        /*Checks*/
     1958        _assert_(in_num_results);
     1959
     1960        /*Count number of results*/
     1961        for(i=0;i<this->results->Size();i++){
     1962                ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
     1963                numberofresults++;
     1964        }
     1965
     1966        /*Allocate output*/
     1967        resultsenums=(int*)xmalloc(numberofresults*sizeof(int));
     1968
     1969        /*populate enums*/
     1970        for(i=0;i<this->results->Size();i++){
     1971                ElementResult* elementresult=(ElementResult*)this->results->GetObjectByOffset(i);
     1972                resultsenums[i]=elementresult->EnumType();
     1973        }
     1974
     1975        /*Assign output pointers:*/
     1976        *in_num_results=numberofresults;
     1977        *in_results_enums=resultsenums;
     1978
     1979}/*}}}*/
    19281980/*FUNCTION Tria::MigrateGroundingLine{{{1*/
    19291981void  Tria::MigrateGroundingLine(void){
  • issm/trunk/src/c/objects/Elements/Tria.h

    r9817 r9874  
    9090                bool   IsOnWater();
    9191                void   GetSolutionFromInputs(Vec solution);
    92                 void   GetVectorFromInputs(Vec vector,int NameEnum);
     92                void   GetVectorFromInputs(Vec vector, int name_enum);
     93                void   GetVectorFromResults(Vec vector,int name_enum);
    9394               
    9495                void   InputArtificialNoise(int enum_type,double min, double max);
     
    110111               
    111112                void   RequestedOutput(int output_enum,int step,double time);
     113                void   ListResultsEnums(int** results_enums,int* num_results);
    112114                void   PatchFill(int* pcount, Patch* patch);
    113115                void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes);
  • issm/trunk/src/c/objects/ExternalResults/DoubleVecExternalResult.cpp

    r9777 r9874  
    2626}
    2727/*}}}*/
    28 /*FUNCTION DoubleVecExternalResult::DoubleVecExternalResult(int enum_type,IssmDoubleVec values,int M){{{1*/
     28/*FUNCTION DoubleVecExternalResult::DoubleVecExternalResult(int enum_type,IssmDoubleVec values,int M,int in_step,double in_time){{{1*/
    2929DoubleVecExternalResult::DoubleVecExternalResult(int in_id, int in_enum_type,double* in_values, int in_M,int in_step,double in_time){
    3030
Note: See TracChangeset for help on using the changeset viewer.