Changeset 10995


Ignore:
Timestamp:
11/30/11 16:24:37 (13 years ago)
Author:
Mathieu Morlighem
Message:

Better error message if first cpu has no element (results cannot be written)

File:
1 edited

Legend:

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

    r10990 r10995  
    170170        Patch  *patch        = NULL;
    171171        int    *resultsenums = NULL;
    172         int    *resultssize  = NULL;
    173         int    *resultsstep  = NULL;
     172        int    *resultssizes  = NULL;
     173        int    *resultssteps  = NULL;
    174174        double *resultstimes = NULL;
    175175        double *vector_serial= NULL;
     
    187187
    188188        if(!results_as_patches){
    189                 /*No patch here, we prepare vectors*/
    190 
    191                 /*OK, see what the first element of this partition has in stock (this is common to all partitions)*/
    192                 Element* element=(Element*)this->GetObjectByOffset(0);
    193                 element->ListResultsInfo(&resultsenums,&resultssize,&resultstimes,&resultsstep,&numberofresults);
     189
     190                /*see what the first element of this partition has in stock (this is common to all partitions)*/
     191                if(my_rank==0){
     192                        if(this->Size()==0) _error_("Cannot write results because first partition has no element. Maybe too many cpus were requested");
     193                        Element* element=(Element*)this->GetObjectByOffset(0);
     194                        element->ListResultsInfo(&resultsenums,&resultssizes,&resultstimes,&resultssteps,&numberofresults);
     195                }
     196                MPI_Bcast(&numberofresults,1,MPI_DOUBLE,0,MPI_COMM_WORLD);
     197                if(my_rank!=0){
     198                        resultsenums=(int*)xmalloc(numberofresults*sizeof(int));
     199                        resultssizes=(int*)xmalloc(numberofresults*sizeof(int));
     200                        resultstimes=(double*)xmalloc(numberofresults*sizeof(double));
     201                        resultssteps=(int*)xmalloc(numberofresults*sizeof(int));
     202                }
     203                MPI_Bcast(resultsenums,numberofresults,MPI_INT,0,MPI_COMM_WORLD);
     204                MPI_Bcast(resultssizes,numberofresults,MPI_INT,0,MPI_COMM_WORLD);
     205                MPI_Bcast(resultstimes,numberofresults,MPI_DOUBLE,0,MPI_COMM_WORLD);
     206                MPI_Bcast(resultssteps,numberofresults,MPI_INT,0,MPI_COMM_WORLD);
    194207
    195208                /*Loop over all results and get nodal vector*/
     
    197210
    198211                        /*Get vector for result number i*/
    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]));
     212                        if(resultssizes[i]==P1Enum)      vectorsize=numberofvertices;
     213                        else if(resultssizes[i]==P0Enum) vectorsize=numberofelements;
     214                        else _error_("Unkown result size: %s",EnumToStringx(resultssizes[i]));
    202215                        vector=NewVec(vectorsize);
    203216
    204217                        for(int j=0;j<this->Size();j++){
    205218                                Element* element=(Element*)this->GetObjectByOffset(j);
    206                                 element->GetVectorFromResults(vector,i,resultssize[i]);
     219                                element->GetVectorFromResults(vector,i,resultssizes[i]);
    207220                        }
    208221                        VecAssemblyBegin(vector);
     
    213226                        if(my_rank==0){
    214227                                /*No need to add this vector for all cpus*/
    215                                 results->AddObject(new DoubleVecExternalResult(results->Size()+1,resultsenums[i],vector_serial,vectorsize,resultsstep[i],resultstimes[i]));
     228                                results->AddObject(new DoubleVecExternalResult(results->Size()+1,resultsenums[i],vector_serial,vectorsize,resultssteps[i],resultstimes[i]));
    216229                        }
    217230
     
    240253        /*Free ressources:*/
    241254        xfree((void**)&resultsenums);
    242         xfree((void**)&resultssize);
     255        xfree((void**)&resultssizes);
    243256        xfree((void**)&resultstimes);
    244         xfree((void**)&resultsstep);
     257        xfree((void**)&resultssteps);
    245258        delete patch;
    246259}
Note: See TracChangeset for help on using the changeset viewer.