Changeset 13486


Ignore:
Timestamp:
09/28/12 21:17:31 (12 years ago)
Author:
Eric.Larour
Message:

CHG: fixed issues with mass flux segments where MassFluxSegmentsPresentEnum was not
being marshalled, leading CreateParameters to not know whether mass flux segments were
available.
The problem is that both autodiff and qmu can upload flux segments. For now, the fix is to
have both classes marshall a flag, and get CreateParameters to sort it out.

Location:
issm/trunk-jpl
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/EnumDefinitions/EnumDefinitions.h

    r13483 r13486  
    2929        AutodiffFosForwardIndexEnum,
    3030        AutodiffFovForwardIndicesEnum,
     31        AutodiffMassFluxSegmentsPresentEnum,
    3132        BalancethicknessSpcthicknessEnum,
    3233        BalancethicknessStabilizationEnum,
     
    159160        MassFluxSegmentsEnum,
    160161        MassFluxSegmentsPresentEnum,
     162        QmuMassFluxSegmentsPresentEnum,
    161163        QmuNumberofpartitionsEnum,
    162164        QmuNumberofresponsesEnum,
  • issm/trunk-jpl/src/c/modules/EnumToStringx/EnumToStringx.cpp

    r13483 r13486  
    3434                case AutodiffFosForwardIndexEnum : return "AutodiffFosForwardIndex";
    3535                case AutodiffFovForwardIndicesEnum : return "AutodiffFovForwardIndices";
     36                case AutodiffMassFluxSegmentsPresentEnum : return "AutodiffMassFluxSegmentsPresent";
    3637                case BalancethicknessSpcthicknessEnum : return "BalancethicknessSpcthickness";
    3738                case BalancethicknessStabilizationEnum : return "BalancethicknessStabilization";
     
    164165                case MassFluxSegmentsEnum : return "MassFluxSegments";
    165166                case MassFluxSegmentsPresentEnum : return "MassFluxSegmentsPresent";
     167                case QmuMassFluxSegmentsPresentEnum : return "QmuMassFluxSegmentsPresent";
    166168                case QmuNumberofpartitionsEnum : return "QmuNumberofpartitions";
    167169                case QmuNumberofresponsesEnum : return "QmuNumberofresponses";
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r13485 r13486  
    2525        Parameters *parameters       = NULL;
    2626        IssmDouble *requestedoutputs = NULL;
    27         bool        isdelta18o,isautodiff;
     27        bool        isdelta18o;
    2828
    2929        /*parameters for mass flux: {{{*/
    3030        int      mass_flux_num_profiles=0;
     31        bool     qmu_mass_flux_present=false;
     32        bool     autodiff_mass_flux_present=false;
    3133        bool     mass_flux_present=false;
    3234        IssmDouble** array=NULL;
     
    156158               
    157159       
    158         if(isautodiff){
    159                 /*Deal with mass flux segments: {{{*/
    160                 iomodel->Constant(&isautodiff,AutodiffIsautodiffEnum);
    161                 iomodel->FetchData(&mass_flux_present,MassFluxSegmentsPresentEnum);
    162                 parameters->AddObject(new BoolParam(MassFluxSegmentsPresentEnum,mass_flux_present));
    163 
    164                 if(mass_flux_present){
    165 
    166                         /*Fetch the mass flux segments necessary to compute the mass fluxes.  Build a DoubleMatArrayParam object out of them: */
    167                         iomodel->FetchData(&array,&mdims_array,&ndims_array,&mass_flux_num_profiles,MassFluxSegmentsEnum);
    168                         if(mass_flux_num_profiles==0)_error_("mass_flux_num_profiles is 0, when MassFlux computations were requested!");
    169 
    170                         /*Go through segments, and extract those that belong to this cpu: */
    171                         for(i=0;i<mass_flux_num_profiles;i++){
    172                                 temp_matrix=array[i];
    173                                 temp_m=mdims_array[i];
    174                                 temp_n=ndims_array[i];
    175 
    176                                 m=0;
     160        /*Deal with mass flux segments: {{{*/
     161        iomodel->FetchData(&qmu_mass_flux_present,QmuMassFluxSegmentsPresentEnum);
     162        iomodel->FetchData(&autodiff_mass_flux_present,AutodiffMassFluxSegmentsPresentEnum);
     163
     164        if(qmu_mass_flux_present || autodiff_mass_flux_present)mass_flux_present=true;
     165        else mass_flux_present=false;
     166        parameters->AddObject(new BoolParam(MassFluxSegmentsPresentEnum,mass_flux_present));
     167
     168        if(mass_flux_present){
     169
     170                /*Fetch the mass flux segments necessary to compute the mass fluxes.  Build a DoubleMatArrayParam object out of them: */
     171                iomodel->FetchData(&array,&mdims_array,&ndims_array,&mass_flux_num_profiles,MassFluxSegmentsEnum);
     172                if(mass_flux_num_profiles==0)_error_("mass_flux_num_profiles is 0, when MassFlux computations were requested!");
     173
     174                /*Go through segments, and extract those that belong to this cpu: */
     175                for(i=0;i<mass_flux_num_profiles;i++){
     176                        temp_matrix=array[i];
     177                        temp_m=mdims_array[i];
     178                        temp_n=ndims_array[i];
     179
     180                        m=0;
     181                        for(j=0;j<temp_m;j++){
     182                                if (  iomodel->my_elements[reCast<int>(*(temp_matrix+5*j+4))-1] )m++;
     183                        }
     184                        if(m){
     185                                matrix=xNewZeroInit<IssmDouble>(5*m);
     186                                count=0;
    177187                                for(j=0;j<temp_m;j++){
    178                                         if (  iomodel->my_elements[reCast<int>(*(temp_matrix+5*j+4))-1] )m++;
    179                                 }
    180                                 if(m){
    181                                         matrix=xNewZeroInit<IssmDouble>(5*m);
    182                                         count=0;
    183                                         for(j=0;j<temp_m;j++){
    184                                                 if (iomodel->my_elements[reCast<int>(*(temp_matrix+5*j+4))-1]){
    185                                                         for(k=0;k<5;k++)*(matrix+5*count+k)=*(temp_matrix+5*j+k);
    186                                                         count++;
    187                                                 }
     188                                        if (iomodel->my_elements[reCast<int>(*(temp_matrix+5*j+4))-1]){
     189                                                for(k=0;k<5;k++)*(matrix+5*count+k)=*(temp_matrix+5*j+k);
     190                                                count++;
    188191                                        }
    189192                                }
    190                                 else{
    191                                         matrix=NULL;
    192                                 }
    193 
    194                                 /*Assign: */
    195                                 array[i]=matrix;
    196                                 mdims_array[i]=m;
    197                                 ndims_array[i]=5;
    198 
    199                                 /*Free temporary matrix: */
    200                                 xDelete<IssmDouble>(temp_matrix);
    201193                        }
    202 
    203                         /*Ok, we have an array of segments, different on every cpu. Create a DoubleMatArrayParam object with it: */
    204                         parameters->AddObject(new DoubleMatArrayParam(MassFluxSegmentsEnum,array,mass_flux_num_profiles,mdims_array,ndims_array));
    205 
    206                         /*Free data: */
    207                         for(i=0;i<mass_flux_num_profiles;i++){
    208                                 IssmDouble* matrix=array[i];
    209                                 xDelete<IssmDouble>(matrix);
     194                        else{
     195                                matrix=NULL;
    210196                        }
    211                         xDelete<int>(mdims_array);
    212                         xDelete<int>(ndims_array);
    213                         xDelete<IssmDouble*>(array);
     197
     198                        /*Assign: */
     199                        array[i]=matrix;
     200                        mdims_array[i]=m;
     201                        ndims_array[i]=5;
     202
     203                        /*Free temporary matrix: */
     204                        xDelete<IssmDouble>(temp_matrix);
    214205                }
    215                 /*}}}*/
     206
     207                /*Ok, we have an array of segments, different on every cpu. Create a DoubleMatArrayParam object with it: */
     208                parameters->AddObject(new DoubleMatArrayParam(MassFluxSegmentsEnum,array,mass_flux_num_profiles,mdims_array,ndims_array));
     209
     210                /*Free data: */
     211                for(i=0;i<mass_flux_num_profiles;i++){
     212                        IssmDouble* matrix=array[i];
     213                        xDelete<IssmDouble>(matrix);
     214                }
     215                xDelete<int>(mdims_array);
     216                xDelete<int>(ndims_array);
     217                xDelete<IssmDouble*>(array);
    216218        }
     219        /*}}}*/
    217220
    218221        /*Before returning, create parameters in case we are running Qmu or control types runs: */
  • issm/trunk-jpl/src/c/modules/StringToEnumx/StringToEnumx.cpp

    r13483 r13486  
    3535              else if (strcmp(name,"AutodiffFosForwardIndex")==0) return AutodiffFosForwardIndexEnum;
    3636              else if (strcmp(name,"AutodiffFovForwardIndices")==0) return AutodiffFovForwardIndicesEnum;
     37              else if (strcmp(name,"AutodiffMassFluxSegmentsPresent")==0) return AutodiffMassFluxSegmentsPresentEnum;
    3738              else if (strcmp(name,"BalancethicknessSpcthickness")==0) return BalancethicknessSpcthicknessEnum;
    3839              else if (strcmp(name,"BalancethicknessStabilization")==0) return BalancethicknessStabilizationEnum;
     
    137138              else if (strcmp(name,"MeshElementconnectivity")==0) return MeshElementconnectivityEnum;
    138139              else if (strcmp(name,"MeshElementonbed")==0) return MeshElementonbedEnum;
    139               else if (strcmp(name,"MeshElementonsurface")==0) return MeshElementonsurfaceEnum;
    140140         else stage=2;
    141141   }
    142142   if(stage==2){
    143               if (strcmp(name,"MeshElements2d")==0) return MeshElements2dEnum;
     143              if (strcmp(name,"MeshElementonsurface")==0) return MeshElementonsurfaceEnum;
     144              else if (strcmp(name,"MeshElements2d")==0) return MeshElements2dEnum;
    144145              else if (strcmp(name,"MeshElements")==0) return MeshElementsEnum;
    145146              else if (strcmp(name,"MeshLowerelements")==0) return MeshLowerelementsEnum;
     
    168169              else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
    169170              else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
     171              else if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
    170172              else if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
    171173              else if (strcmp(name,"QmuNumberofresponses")==0) return QmuNumberofresponsesEnum;
     
    259261              else if (strcmp(name,"SurfaceSlopeXAnalysis")==0) return SurfaceSlopeXAnalysisEnum;
    260262              else if (strcmp(name,"SurfaceSlopeYAnalysis")==0) return SurfaceSlopeYAnalysisEnum;
    261               else if (strcmp(name,"ThermalAnalysis")==0) return ThermalAnalysisEnum;
    262               else if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum;
    263263         else stage=3;
    264264   }
    265265   if(stage==3){
    266               if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
     266              if (strcmp(name,"ThermalAnalysis")==0) return ThermalAnalysisEnum;
     267              else if (strcmp(name,"ThermalSolution")==0) return ThermalSolutionEnum;
     268              else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
    267269              else if (strcmp(name,"Approximation")==0) return ApproximationEnum;
    268270              else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum;
     
    382384              else if (strcmp(name,"SurfaceRelVelMisfit")==0) return SurfaceRelVelMisfitEnum;
    383385              else if (strcmp(name,"SurfaceSlopeX")==0) return SurfaceSlopeXEnum;
    384               else if (strcmp(name,"SurfaceSlopeY")==0) return SurfaceSlopeYEnum;
    385               else if (strcmp(name,"Temperature")==0) return TemperatureEnum;
    386386         else stage=4;
    387387   }
    388388   if(stage==4){
    389               if (strcmp(name,"TemperatureOld")==0) return TemperatureOldEnum;
     389              if (strcmp(name,"SurfaceSlopeY")==0) return SurfaceSlopeYEnum;
     390              else if (strcmp(name,"Temperature")==0) return TemperatureEnum;
     391              else if (strcmp(name,"TemperatureOld")==0) return TemperatureOldEnum;
    390392              else if (strcmp(name,"TemperaturePicard")==0) return TemperaturePicardEnum;
    391393              else if (strcmp(name,"TemperatureSurface")==0) return TemperatureSurfaceEnum;
     
    505507              else if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum;
    506508              else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum;
    507               else if (strcmp(name,"XY")==0) return XYEnum;
    508               else if (strcmp(name,"XYZP")==0) return XYZPEnum;
    509509         else stage=5;
    510510   }
    511511   if(stage==5){
    512               if (strcmp(name,"Option")==0) return OptionEnum;
     512              if (strcmp(name,"XY")==0) return XYEnum;
     513              else if (strcmp(name,"XYZP")==0) return XYZPEnum;
     514              else if (strcmp(name,"Option")==0) return OptionEnum;
    513515              else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
    514516              else if (strcmp(name,"OptionCell")==0) return OptionCellEnum;
  • issm/trunk-jpl/src/m/classes/autodiff.m

    r13483 r13486  
    5656                       
    5757                        %early return
    58                         if ~obj.isautodiff, return; end
     58                        if ~obj.isautodiff,
     59                                WriteData(fid,'data',false,'enum',AutodiffMassFluxSegmentsPresentEnum,'format','Boolean');
     60                                return;
     61                        end
    5962
    6063                        %process dependent variables {{{
     
    148151                                end
    149152                        end
    150                         if ~isempty(mass_flux_segments),
     153                        if ~isempty(mass_flux_segments), 
    151154                                WriteData(fid,'data',mass_flux_segments,'enum',MassFluxSegmentsEnum,'format','MatArray');
    152155                                flag=true;
    153                                 WriteData(fid,'data',flag,'enum',MassFluxSegmentsPresentEnum,'format','Boolean');
     156                        else
     157                                flag=false;
    154158                        end
     159                        WriteData(fid,'data',flag,'enum',AutodiffMassFluxSegmentsPresentEnum,'format','Boolean');
    155160                        %}}}
    156161
  • issm/trunk-jpl/src/m/classes/qmu.m

    r13483 r13486  
    142142                function marshall(obj,fid) % {{{
    143143                        WriteData(fid,'object',obj,'fieldname','isdakota','format','Boolean');
    144                         if ~obj.isdakota, return; end
     144                        if ~obj.isdakota,
     145                                WriteData(fid,'data',false,'enum',QmuMassFluxSegmentsPresentEnum,'format','Boolean');
     146                                return;
     147                        end
    145148                        WriteData(fid,'object',obj,'fieldname','partition','format','DoubleMat','mattype',2);
    146149                        WriteData(fid,'object',obj,'fieldname','numberofpartitions','format','Integer');
     
    148151                        WriteData(fid,'object',obj,'fieldname','variabledescriptors','format','StringArray');
    149152                        WriteData(fid,'object',obj,'fieldname','responsedescriptors','format','StringArray');
    150                         WriteData(fid,'data',obj.mass_flux_segments,'enum',MassFluxSegmentsEnum,'format','MatArray');
    151                         if ~isempty(mass_flux_segments),
    152                                 flag=true;
    153                                 WriteData(fid,'data',flag,'enum',MassFluxSegmentsPrsentEnum,'format','Boolean');
     153                        if ~isempty(obj.mass_flux_segments),
     154                                WriteData(fid,'data',obj.mass_flux_segments,'enum',MassFluxSegmentsEnum,'format','MatArray');
     155                                flag=true;
     156                        else
     157                                flag=false;
    154158                        end
     159                        WriteData(fid,'data',flag,'enum',QmuMassFluxSegmentsPresentEnum,'format','Boolean');
    155160                end % }}}
    156161        end
  • issm/trunk-jpl/src/m/enum/EnumDefinitions.py

    r13483 r13486  
    179179        return StringToEnum('AutodiffFovForwardIndices')[0]
    180180
     181def AutodiffMassFluxSegmentsPresentEnum():
     182        """
     183        AUTODIFFMASSFLUXSEGMENTSPRESENTENUM - Enum of AutodiffMassFluxSegmentsPresent
     184
     185           Usage:
     186              macro=AutodiffMassFluxSegmentsPresentEnum()
     187        """
     188
     189        return StringToEnum('AutodiffMassFluxSegmentsPresent')[0]
     190
    181191def BalancethicknessSpcthicknessEnum():
    182192        """
     
    14791489        return StringToEnum('MassFluxSegmentsPresent')[0]
    14801490
     1491def QmuMassFluxSegmentsPresentEnum():
     1492        """
     1493        QMUMASSFLUXSEGMENTSPRESENTENUM - Enum of QmuMassFluxSegmentsPresent
     1494
     1495           Usage:
     1496              macro=QmuMassFluxSegmentsPresentEnum()
     1497        """
     1498
     1499        return StringToEnum('QmuMassFluxSegmentsPresent')[0]
     1500
    14811501def QmuNumberofpartitionsEnum():
    14821502        """
     
    49074927        """
    49084928
    4909         return 489
    4910 
     4929        return 491
     4930
  • issm/trunk-jpl/src/m/enum/MaximumNumberOfEnums.m

    r13483 r13486  
    99%      macro=MaximumNumberOfEnums()
    1010
    11 macro=489;
     11macro=491;
  • issm/trunk-jpl/test/NightlyRun/test223.m

    r12791 r13486  
    44md=setflowequation(md,'macayeal','all');
    55md.geometry.bed=md.geometry.bed+50; md.geometry.surface=md.geometry.surface+50;
    6 md.cluster=generic('name',oshostname(),'np',3);
     6md.cluster=generic('name',oshostname(),'np',1);
    77md.prognostic.hydrostatic_adjustment='Incremental';
    88md=solve(md,TransientSolutionEnum);
Note: See TracChangeset for help on using the changeset viewer.