Changeset 5529


Ignore:
Timestamp:
08/23/10 17:33:25 (15 years ago)
Author:
Eric.Larour
Message:

New UnitConversion routine, to be used everywhere for transparent conversion of units.

Location:
issm/trunk/src/c
Files:
12 edited
1 moved

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/c/Makefile.am

    r5478 r5529  
    107107                                        ./objects/IoModel.cpp\
    108108                                        ./objects/ElementResults/ElementResultLocal.h\
    109                                         ./objects/ElementResults/NodalValuesUnitConversion.cpp\
    110109                                        ./objects/ElementResults/DoubleElementResult.h\
    111110                                        ./objects/ElementResults/DoubleElementResult.cpp\
     
    244243                                        ./shared/Numerics/OptFunc.cpp\
    245244                                        ./shared/Numerics/extrema.cpp\
     245                                        ./shared/Numerics/UnitConversion.cpp\
    246246                                        ./shared/Exceptions/exceptions.h\
    247247                                        ./shared/Exceptions/Exceptions.cpp\
     
    661661                                        ./objects/Patch.cpp\
    662662                                        ./objects/ElementResults/ElementResultLocal.h\
    663                                         ./objects/ElementResults/NodalValuesUnitConversion.cpp\
    664663                                        ./objects/ElementResults/DoubleElementResult.h\
    665664                                        ./objects/ElementResults/DoubleElementResult.cpp\
     
    796795                                        ./shared/Numerics/OptFunc.cpp\
    797796                                        ./shared/Numerics/extrema.cpp\
     797                                        ./shared/Numerics/UnitConversion.cpp\
    798798                                        ./shared/Exceptions/exceptions.h\
    799799                                        ./shared/Exceptions/Exceptions.cpp\
  • issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp

    r5477 r5529  
    153153                                /*Recover data: */
    154154                                IoModelFetchData(&dakota_parameter,NULL,NULL,iomodel_handle,EnumToModelField(StringToEnum(tag)));
    155                                        
     155
     156                                /*Convert units: */
     157                                UnitConversion(dakota_parameter,iomodel->numberofvertices,ExtToIuEnum,StringToEnum(tag),parameters);
     158
    156159                                /*Add to parameters: */
    157160                                parameters->AddObject(new DoubleVecParam(StringToEnum(tag),dakota_parameter,iomodel->numberofvertices));
  • issm/trunk/src/c/objects/ElementResults/DoubleElementResult.cpp

    r5103 r5529  
    162162void DoubleElementResult::ProcessUnits(Parameters* parameters){
    163163       
    164         NodalValuesUnitConversion(&this->value,1,this->enum_type,parameters);
     164        this->value=UnitConversion(this->value,IuToExtEnum,this->enum_type,parameters);
    165165
    166166}
  • issm/trunk/src/c/objects/ElementResults/ElementResult.h

    r4927 r5529  
    2525};
    2626
    27 void NodalValuesUnitConversion(double* nodal_values, int num_nodal_values,int enum_type,Parameters* parameters);
    2827#endif
  • issm/trunk/src/c/objects/ElementResults/ElementResultLocal.h

    r4050 r5529  
    88class Parameters;
    99
    10 void NodalValuesUnitConversion(double* patch, int patch_size,int enum_type,Parameters* parameters);
    11 
    1210#endif //ifndef _ELEMENTRESULTLOCAL_H_
    1311
  • issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp

    r5103 r5529  
    173173void PentaVertexElementResult::ProcessUnits(Parameters* parameters){
    174174       
    175         NodalValuesUnitConversion(this->values,6,this->enum_type,parameters);
     175        UnitConversion(this->values,6,IuToExtEnum,this->enum_type,parameters);
    176176
    177177}
  • issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp

    r5103 r5529  
    162162void TriaVertexElementResult::ProcessUnits(Parameters* parameters){
    163163       
    164         NodalValuesUnitConversion(this->values,3,this->enum_type,parameters);
     164        UnitConversion(this->values,3,IuToExtEnum,this->enum_type,parameters);
    165165
    166166}
  • issm/trunk/src/c/objects/Elements/Penta.cpp

    r5523 r5529  
    13081308
    13091309        /*process units if requested: */
    1310         if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
     1310        if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
    13111311
    13121312        /*now, compute maximum:*/
     
    13371337
    13381338        /*process units if requested: */
    1339         if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
     1339        if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
    13401340
    13411341        /*now, compute maximum:*/
     
    13661366
    13671367        /*process units if requested: */
    1368         if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
     1368        if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
    13691369
    13701370        /*now, compute maximum:*/
     
    13951395
    13961396        /*process units if requested: */
    1397         if(process_units)NodalValuesUnitConversion(&vel_values[0],numgrids,VelEnum,this->parameters);
     1397        if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
    13981398
    13991399        /*now, compute maximum:*/
     
    14251425
    14261426        /*process units if requested: */
    1427         if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
     1427        if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
    14281428
    14291429        /*now, compute maximum:*/
     
    14551455
    14561456        /*process units if requested: */
    1457         if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
     1457        if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
    14581458
    14591459        /*now, compute maximum:*/
     
    14851485
    14861486        /*process units if requested: */
    1487         if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
     1487        if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
    14881488
    14891489        /*now, compute maximum:*/
     
    15151515
    15161516        /*process units if requested: */
    1517         if(process_units)NodalValuesUnitConversion(&vel_values[0],numgrids,VelEnum,this->parameters);
     1517        if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
    15181518
    15191519        /*now, compute minimum:*/
     
    15451545
    15461546        /*process units if requested: */
    1547         if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
     1547        if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
    15481548
    15491549        /*now, compute minimum:*/
     
    15751575
    15761576        /*process units if requested: */
    1577         if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
     1577        if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
    15781578
    15791579        /*now, compute minimum:*/
     
    16051605
    16061606        /*process units if requested: */
    1607         if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
     1607        if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
    16081608
    16091609        /*now, compute minimum:*/
  • issm/trunk/src/c/objects/Elements/Tria.cpp

    r5518 r5529  
    16521652
    16531653        /*Process units: */
    1654         NodalValuesUnitConversion(&mass_flux,1,MassFluxEnum,this->parameters);
     1654        mass_flux=UnitConversion(mass_flux,IuToExtEnum,MassFluxEnum,this->parameters);
    16551655
    16561656        return mass_flux;
     
    16741674
    16751675        /*process units if requested: */
    1676         if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
     1676        if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
    16771677
    16781678        /*now, compute maximum:*/
     
    17031703
    17041704        /*process units if requested: */
    1705         if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
     1705        if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
    17061706
    17071707        /*now, compute maximum:*/
     
    17321732
    17331733        /*process units if requested: */
    1734         if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
     1734        if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
    17351735
    17361736        /*now, compute maximum:*/
     
    17611761
    17621762        /*process units if requested: */
    1763         if(process_units)NodalValuesUnitConversion(&vel_values[0],numgrids,VelEnum,this->parameters);
     1763        if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
    17641764
    17651765        /*now, compute maximum:*/
     
    17911791
    17921792        /*process units if requested: */
    1793         if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
     1793        if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
    17941794
    17951795        /*now, compute maximum:*/
     
    18211821
    18221822        /*process units if requested: */
    1823         if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
     1823        if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
    18241824
    18251825        /*now, compute maximum:*/
     
    18511851
    18521852        /*process units if requested: */
    1853         if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
     1853        if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
    18541854
    18551855        /*now, compute maximum:*/
     
    18811881
    18821882        /*process units if requested: */
    1883         if(process_units)NodalValuesUnitConversion(&vel_values[0],numgrids,VelEnum,this->parameters);
     1883        if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
    18841884
    18851885        /*now, compute minimum:*/
     
    19111911
    19121912        /*process units if requested: */
    1913         if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
     1913        if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
    19141914
    19151915        /*now, compute minimum:*/
     
    19411941
    19421942        /*process units if requested: */
    1943         if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
     1943        if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
    19441944
    19451945        /*now, compute minimum:*/
     
    19711971
    19721972        /*process units if requested: */
    1973         if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
     1973        if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
    19741974
    19751975        /*now, compute minimum:*/
     
    21522152        }
    21532153        /*Process units: */
    2154         if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceAbsVelMisfitEnum,this->parameters);
     2154        if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceAbsVelMisfitEnum,this->parameters);
    21552155
    21562156        /*Apply weights to misfits*/
     
    22842284
    22852285        /*Process units: */
    2286         if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceRelVelMisfitEnum,this->parameters);
     2286        if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceRelVelMisfitEnum,this->parameters);
    22872287
    22882288        /*Apply weights to misfits*/
     
    24142414
    24152415        /*Process units: */
    2416         if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceLogVelMisfitEnum,this->parameters);
     2416        if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceLogVelMisfitEnum,this->parameters);
    24172417
    24182418        /*Apply weights to misfits*/
     
    25462546
    25472547        /*Process units: */
    2548         if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceLogVxVyMisfitEnum,this->parameters);
     2548        if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceLogVxVyMisfitEnum,this->parameters);
    25492549
    25502550        /*Apply weights to misfits*/
     
    26742674
    26752675        /*Process units: */
    2676         if(process_units)NodalValuesUnitConversion(&misfit_square_list[0],numgrids,SurfaceAverageVelMisfitEnum,this->parameters);
     2676        if(process_units)UnitConversion(&misfit_square_list[0],numgrids,IuToExtEnum,SurfaceAverageVelMisfitEnum,this->parameters);
    26772677
    26782678        /*Take the square root, and scale by surface: */
  • issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp

    r5513 r5529  
    418418
    419419        /*Process units if requested: */
    420         if(process_units)NodalValuesUnitConversion(&valuescopy[0],numnodes,enum_type,parameters);
     420        if(process_units)UnitConversion(&valuescopy[0],numnodes,IuToExtEnum,enum_type,parameters);
    421421
    422422        /*Now, figure out minimum of valuescopy: */
  • issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp

    r5513 r5529  
    270270
    271271        /*Process units if requested: */
    272         if(process_units)NodalValuesUnitConversion(&valuescopy[0],numnodes,enum_type,parameters);
     272        if(process_units)UnitConversion(&valuescopy[0],numnodes,IuToExtEnum,enum_type,parameters);
    273273
    274274        /*Now, figure out minimum of valuescopy: */
  • issm/trunk/src/c/shared/Numerics/UnitConversion.cpp

    r5522 r5529  
    1 /*!\file:  NodalValuesUnitConversion.cpp
    2  * \brief: process nodal_values held in a ElementResult object.
    3  * For example, velocities need to be in m/yr, melting rates in m/yr, etc ...
    4  * This centralizes all post-processing of results when they are being output.
     1/*!\file:  UnitConversion.cpp
     2 * \brief: convert units from the model to IU or from IU to the model.
    53 */
    64
     5/*headers {{{1*/
    76#ifdef HAVE_CONFIG_H
    87        #include "config.h"
     
    1615#include "../../shared/shared.h"
    1716
    18 void NodalValuesUnitConversion(double* nodal_values, int num_nodal_values,int enum_type,Parameters* parameters){
     17double UnitConversionScaleFactor(int type_enum,Parameters* parameters);
     18/*}}}*/
    1919
     20void UnitConversion(double* values, int numvalues,int direction_enum, int type_enum, Parameters* parameters){
     21
     22        double scale;
    2023        int i;
    21         double yts;
     24
     25        /*Get scaling factor: */
     26        scale=UnitConversionScaleFactor(type_enum,parameters);
     27
     28        /*Now, which direction are we going? once determined, use scale factor: */
     29        if(direction_enum==IuToExtEnum) for(i=0;i<numvalues;i++)values[i]=values[i]*scale;
     30        else if(direction_enum==ExtToIuEnum) for(i=0;i<numvalues;i++)values[i]=values[i]/scale;
     31        else ISSMERROR(" wrong direction for unit conversion, either IuToExtEnum or ExtToIuEnum. ");
     32
     33}
     34
     35double UnitConversion(double value, int direction_enum, int type_enum, Parameters* parameters){
     36
    2237        double scale;
    2338
     39        /*Get scaling factor: */
     40        scale=UnitConversionScaleFactor(type_enum,parameters);
     41
     42        /*Now, which direction are we going? once determined, use scale factor: */
     43        if(direction_enum==IuToExtEnum)value=value*scale;
     44        else if(direction_enum==ExtToIuEnum)value=value/scale;
     45        else ISSMERROR(" wrong direction for unit conversion, either IuToExtEnum or ExtToIuEnum. ");
     46
     47        return value;
     48}
     49
     50
     51
     52double UnitConversionScaleFactor(int type_enum,Parameters* parameters){
     53
     54        double yts;
     55       
    2456        /*Get some values from parameters, that are often needed: */
    2557        parameters->FindParam(&yts,YtsEnum);
    2658
    27         /*Get scaling factor: */
    28         switch(enum_type){
     59        double scale;
     60        switch(type_enum){
    2961                case VxEnum:   scale=yts;break; //m/yr
     62                case VxObsEnum:   scale=yts;break; //m/yr
    3063                case VyEnum:   scale=yts;break; //m/yr
     64                case VyObsEnum:   scale=yts;break; //m/yr
    3165                case VzEnum:   scale=yts;break; //m/yr
     66                case VzObsEnum:   scale=yts;break; //m/yr
    3267                case VelEnum:  scale=yts;break; //m/yr
     68                case VelObsEnum:  scale=yts;break; //m/yr
    3369                case DhDtEnum: scale=yts;break; //m/yr
    3470                case MeltingRateEnum: scale=yts;break; //m/yr
    3571                case MisfitEnum:      scale=pow(yts,2);break; //(m/yr)^2
    3672                case MassFluxEnum:    scale=pow(10,-12)*yts;break; // (GigaTon/year)
    37                 default: return;
     73                default: scale=1.0; break;
    3874        }
    39                
    40         /*Scale : */
    41         for(i=0;i<num_nodal_values;i++)nodal_values[i]=nodal_values[i]*scale;
     75        return scale;
    4276}
     77
     78
     79
  • issm/trunk/src/c/shared/Numerics/numerics.h

    r4055 r5529  
    99#include "./isnan.h"
    1010class Input;
     11class Parameters;
    1112
    1213struct OptArgs;
     
    2021double norm(double* vector);
    2122void IsInputConverged(double* peps, Input** new_inputs,Input** old_inputs,int num_inputs,int criterion_enum);
     23void UnitConversion(double* values, int numvalues,int direction_enum, int type_enum, Parameters* parameters);
     24double UnitConversion(double value, int direction_enum, int type_enum, Parameters* parameters);
    2225
    2326#endif //ifndef _NUMERICS_H_
Note: See TracChangeset for help on using the changeset viewer.