source: issm/oecreview/Archive/12321-12677/ISSM-12470-12471.diff@ 12679

Last change on this file since 12679 was 12679, checked in by Mathieu Morlighem, 13 years ago

Added 12321-12677

File size: 240.0 KB
  • u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/Element.h

     
    3737                virtual int    Sid()=0;
    3838                virtual bool   IsFloating()=0;
    3939                virtual bool   IsNodeOnShelf()=0;
    40                 virtual bool   IsNodeOnShelfFromFlags(double* flags)=0;
     40                virtual bool   IsNodeOnShelfFromFlags(IssmDouble* flags)=0;
    4141                virtual bool   IsOnBed()=0;
    42                 virtual void   GetInputListOnVertices(double* pvalue,int enumtype)=0;
    43                 virtual void   GetInputListOnVertices(double* pvalue,int enumtype,double defaultvalue)=0;
    44                 virtual void   GetInputValue(double* pvalue,Node* node,int enumtype)=0;
     42                virtual void   GetInputListOnVertices(IssmDouble* pvalue,int enumtype)=0;
     43                virtual void   GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue)=0;
     44                virtual void   GetInputValue(IssmDouble* pvalue,Node* node,int enumtype)=0;
    4545               
    46                 virtual double SurfaceArea(void)=0;
     46                virtual IssmDouble SurfaceArea(void)=0;
    4747                virtual void   InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum)=0;
    4848                virtual void   ComputeBasalStress(Vector* sigma_b)=0;
    4949                virtual void   ComputeStrainRate(Vector* eps)=0;
    5050                virtual void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes)=0;
    5151                virtual void   PatchFill(int* pcount, Patch* patch)=0;
    52                 virtual void   ListResultsInfo(int** results_enums,int** results_size,double** results_times,int** results_steps,int* num_results)=0;
     52                virtual void   ListResultsInfo(int** results_enums,int** results_size,IssmDouble** results_times,int** results_steps,int* num_results)=0;
    5353                virtual void   DeleteResults(void)=0;
    5454                virtual void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type)=0;
    55                 virtual void   InputToResult(int enum_type,int step,double time)=0;
     55                virtual void   InputToResult(int enum_type,int step,IssmDouble time)=0;
    5656                virtual void   InputDuplicate(int original_enum,int new_enum)=0;
    57                 virtual void   InputCreate(double scalar,int name,int code)=0;
    58                 virtual void   InputCreate(double* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code)=0;
     57                virtual void   InputCreate(IssmDouble scalar,int name,int code)=0;
     58                virtual void   InputCreate(IssmDouble* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code)=0;
    5959                virtual void   ProcessResultsUnits(void)=0;
    60                 virtual void   RequestedOutput(int output_enum,int step,double time)=0;
     60                virtual void   RequestedOutput(int output_enum,int step,IssmDouble time)=0;
    6161               
    62                 virtual int    NodalValue(double* pvalue, int index, int natureofdataenum,bool process_units)=0;
    63                 virtual void   InputScale(int enum_type,double scale_factor)=0;
     62                virtual int    NodalValue(IssmDouble* pvalue, int index, int natureofdataenum,bool process_units)=0;
     63                virtual void   InputScale(int enum_type,IssmDouble scale_factor)=0;
    6464                virtual void   GetVectorFromInputs(Vector* vector, int name_enum)=0;
    6565                virtual void   GetVectorFromResults(Vector* vector,int id,int interp)=0;
    66                 virtual void   InputArtificialNoise(int enum_type,double min,double max)=0;
    67                 virtual bool   InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums)=0;
    68                 virtual void   AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,double* vertex_response,double* qmu_part)=0;
     66                virtual void   InputArtificialNoise(int enum_type,IssmDouble min,IssmDouble max)=0;
     67                virtual bool   InputConvergence(IssmDouble* eps, int* enums,int num_enums,int* criterionenums,IssmDouble* criterionvalues,int num_criterionenums)=0;
     68                virtual void   AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0;
    6969                virtual int*   GetHorizontalNeighboorSids(void)=0;
    70                 virtual double TimeAdapt()=0;
    71                 virtual void   MigrateGroundingLine(double* old_floating_ice,double* sheet_ungrounding)=0;
     70                virtual IssmDouble TimeAdapt()=0;
     71                virtual void   MigrateGroundingLine(IssmDouble* old_floating_ice,IssmDouble* sheet_ungrounding)=0;
    7272                virtual void   PotentialSheetUngrounding(Vector* potential_sheet_ungrounding)=0;
    73                 virtual void   PositiveDegreeDay(double* pdds,double* pds,double signorm)=0;
    74                 virtual int    UpdatePotentialSheetUngrounding(double* potential_sheet_ungrounding,Vector* vec_nodes_on_iceshelf,double* nodes_on_iceshelf)=0;
     73                virtual void   PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm)=0;
     74                virtual int    UpdatePotentialSheetUngrounding(IssmDouble* potential_sheet_ungrounding,Vector* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf)=0;
    7575                virtual void   ResetCoordinateSystem()=0;
    76                 virtual void   SmearFunction(Vector* smearedvector,double (*WeightFunction)(double distance,double radius),double radius)=0;
     76                virtual void   SmearFunction(Vector* smearedvector,IssmDouble (*WeightFunction)(IssmDouble distance,IssmDouble radius),IssmDouble radius)=0;
    7777
    7878                #ifdef _HAVE_RESPONSES_
    79                 virtual void   MinVel(double* pminvel, bool process_units)=0;
    80                 virtual void   MaxVel(double* pmaxvel, bool process_units)=0;
    81                 virtual void   MinVx(double* pminvx, bool process_units)=0;
    82                 virtual void   MaxVx(double* pmaxvx, bool process_units)=0;
    83                 virtual void   MaxAbsVx(double* pmaxabsvx, bool process_units)=0;
    84                 virtual void   MinVy(double* pminvy, bool process_units)=0;
    85                 virtual void   MaxVy(double* pmaxvy, bool process_units)=0;
    86                 virtual void   MaxAbsVy(double* pmaxabsvy, bool process_units)=0;
    87                 virtual void   MinVz(double* pminvz, bool process_units)=0;
    88                 virtual void   MaxVz(double* pmaxvz, bool process_units)=0;
    89                 virtual void   MaxAbsVz(double* pmaxabsvz, bool process_units)=0;
    90                 virtual double MassFlux(double* segment,bool process_units)=0;
    91                 virtual void   ElementResponse(double* presponse,int response_enum,bool process_units)=0;
    92                 virtual double IceVolume(void)=0;
     79                virtual void   MinVel(IssmDouble* pminvel, bool process_units)=0;
     80                virtual void   MaxVel(IssmDouble* pmaxvel, bool process_units)=0;
     81                virtual void   MinVx(IssmDouble* pminvx, bool process_units)=0;
     82                virtual void   MaxVx(IssmDouble* pmaxvx, bool process_units)=0;
     83                virtual void   MaxAbsVx(IssmDouble* pmaxabsvx, bool process_units)=0;
     84                virtual void   MinVy(IssmDouble* pminvy, bool process_units)=0;
     85                virtual void   MaxVy(IssmDouble* pmaxvy, bool process_units)=0;
     86                virtual void   MaxAbsVy(IssmDouble* pmaxabsvy, bool process_units)=0;
     87                virtual void   MinVz(IssmDouble* pminvz, bool process_units)=0;
     88                virtual void   MaxVz(IssmDouble* pmaxvz, bool process_units)=0;
     89                virtual void   MaxAbsVz(IssmDouble* pmaxabsvz, bool process_units)=0;
     90                virtual IssmDouble MassFlux(IssmDouble* segment,bool process_units)=0;
     91                virtual void   ElementResponse(IssmDouble* presponse,int response_enum,bool process_units)=0;
     92                virtual IssmDouble IceVolume(void)=0;
    9393                #endif
    9494
    9595                #ifdef _HAVE_CONTROL_
    9696                virtual void   Gradj(Vector* gradient,int control_type,int control_index)=0;
    97                 virtual double ThicknessAbsMisfit(bool process_units  ,int weight_index)=0;
    98                 virtual double SurfaceAbsVelMisfit(bool process_units ,int weight_index)=0;
    99                 virtual double SurfaceRelVelMisfit(bool process_units ,int weight_index)=0;
    100                 virtual double SurfaceLogVelMisfit(bool process_units ,int weight_index)=0;
    101                 virtual double SurfaceLogVxVyMisfit(bool process_units,int weight_index)=0;
    102                 virtual double SurfaceAverageVelMisfit(bool process_units,int weight_index)=0;
    103                 virtual double ThicknessAbsGradient(bool process_units,int weight_index)=0;
    104                 virtual double RheologyBbarAbsGradient(bool process_units,int weight_index)=0;
    105                 virtual double DragCoefficientAbsGradient(bool process_units,int weight_index)=0;
     97                virtual IssmDouble ThicknessAbsMisfit(bool process_units  ,int weight_index)=0;
     98                virtual IssmDouble SurfaceAbsVelMisfit(bool process_units ,int weight_index)=0;
     99                virtual IssmDouble SurfaceRelVelMisfit(bool process_units ,int weight_index)=0;
     100                virtual IssmDouble SurfaceLogVelMisfit(bool process_units ,int weight_index)=0;
     101                virtual IssmDouble SurfaceLogVxVyMisfit(bool process_units,int weight_index)=0;
     102                virtual IssmDouble SurfaceAverageVelMisfit(bool process_units,int weight_index)=0;
     103                virtual IssmDouble ThicknessAbsGradient(bool process_units,int weight_index)=0;
     104                virtual IssmDouble RheologyBbarAbsGradient(bool process_units,int weight_index)=0;
     105                virtual IssmDouble DragCoefficientAbsGradient(bool process_units,int weight_index)=0;
    106106                virtual void   ControlInputGetGradient(Vector* gradient,int enum_type,int control_index)=0;
    107                 virtual void   ControlInputSetGradient(double* gradient,int enum_type,int control_index)=0;
    108                 virtual void   ControlInputScaleGradient(int enum_type, double scale)=0;
     107                virtual void   ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index)=0;
     108                virtual void   ControlInputScaleGradient(int enum_type, IssmDouble scale)=0;
    109109                virtual void   GetVectorFromControlInputs(Vector* gradient,int control_enum,int control_index,const char* data)=0;
    110                 virtual void   SetControlInputsFromVector(double* vector,int control_enum,int control_index)=0;
    111                 virtual void   InputControlUpdate(double scalar,bool save_parameter)=0;
     110                virtual void   SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index)=0;
     111                virtual void   InputControlUpdate(IssmDouble scalar,bool save_parameter)=0;
    112112                #endif
    113113};
    114114#endif
  • u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/Tria.cpp

     
    124124
    125125/*Other*/
    126126/*FUNCTION Tria::AverageOntoPartition {{{*/
    127 void  Tria::AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,double* vertex_response,double* qmu_part){
     127void  Tria::AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){
    128128
    129129        bool      already=false;
    130130        int       i,j;
    131131        int       partition[NUMVERTICES];
    132132        int       offsetsid[NUMVERTICES];
    133133        int       offsetdof[NUMVERTICES];
    134         double    area;
    135         double    mean;
    136         double    values[3];
     134        IssmDouble    area;
     135        IssmDouble    mean;
     136        IssmDouble    values[3];
    137137
    138138        /*First, get the area: */
    139139        area=this->GetArea();
     
    231231
    232232        /*Intermediaries */
    233233        int        i,j,ig;
    234         double     heatcapacity,latentheat;
    235         double     Jdet,D_scalar;
    236         double     xyz_list[NUMVERTICES][3];
    237         double     L[3];
     234        IssmDouble     heatcapacity,latentheat;
     235        IssmDouble     Jdet,D_scalar;
     236        IssmDouble     xyz_list[NUMVERTICES][3];
     237        IssmDouble     L[3];
    238238        GaussTria *gauss=NULL;
    239239
    240240        /*Initialize Element matrix*/
     
    290290        /*Intermediaries */
    291291        int        stabilization;
    292292        int        i,j,ig,dim;
    293         double     Jdettria,DL_scalar,dt,h;
    294         double     vel,vx,vy,dvxdx,dvydy;
    295         double     dvx[2],dvy[2];
    296         double     v_gauss[2]={0.0};
    297         double     xyz_list[NUMVERTICES][3];
    298         double     L[NUMVERTICES];
    299         double     B[2][NUMVERTICES];
    300         double     Bprime[2][NUMVERTICES];
    301         double     K[2][2]                        ={0.0};
    302         double     KDL[2][2]                      ={0.0};
    303         double     DL[2][2]                        ={0.0};
    304         double     DLprime[2][2]                   ={0.0};
     293        IssmDouble     Jdettria,DL_scalar,dt,h;
     294        IssmDouble     vel,vx,vy,dvxdx,dvydy;
     295        IssmDouble     dvx[2],dvy[2];
     296        IssmDouble     v_gauss[2]={0.0};
     297        IssmDouble     xyz_list[NUMVERTICES][3];
     298        IssmDouble     L[NUMVERTICES];
     299        IssmDouble     B[2][NUMVERTICES];
     300        IssmDouble     Bprime[2][NUMVERTICES];
     301        IssmDouble     K[2][2]                        ={0.0};
     302        IssmDouble     KDL[2][2]                      ={0.0};
     303        IssmDouble     DL[2][2]                        ={0.0};
     304        IssmDouble     DLprime[2][2]                   ={0.0};
    305305        GaussTria *gauss=NULL;
    306306
    307307        /*Initialize Element matrix*/
     
    409409
    410410        /*Intermediaries */
    411411        int        i,j,ig,dim;
    412         double     xyz_list[NUMVERTICES][3];
    413         double     Jdettria,dt,vx,vy;
    414         double     L[NUMVERTICES];
    415         double     B[2][NUMVERTICES];
    416         double     Bprime[2][NUMVERTICES];
    417         double     DL[2][2]={0.0};
    418         double     DLprime[2][2]={0.0};
    419         double     DL_scalar;
     412        IssmDouble     xyz_list[NUMVERTICES][3];
     413        IssmDouble     Jdettria,dt,vx,vy;
     414        IssmDouble     L[NUMVERTICES];
     415        IssmDouble     B[2][NUMVERTICES];
     416        IssmDouble     Bprime[2][NUMVERTICES];
     417        IssmDouble     DL[2][2]={0.0};
     418        IssmDouble     DLprime[2][2]={0.0};
     419        IssmDouble     DL_scalar;
    420420        GaussTria  *gauss=NULL;
    421421
    422422        /*Initialize Element matrix*/
     
    484484
    485485        /* Intermediaries */
    486486        int        i,j,ig;
    487         double     DL_scalar,Jdet;
    488         double     xyz_list[NUMVERTICES][3];
    489         double     L[1][3];
     487        IssmDouble     DL_scalar,Jdet;
     488        IssmDouble     xyz_list[NUMVERTICES][3];
     489        IssmDouble     L[1][3];
    490490        GaussTria *gauss = NULL;
    491491
    492492        /*Initialize Element matrix*/
     
    598598
    599599        /*Intermediaries */
    600600        int        i,j,ig;
    601         double     Jdettria,dt;
    602         double     surface_mass_balance_g,basal_melting_g,basal_melting_correction_g,thickness_g;
    603         double     xyz_list[NUMVERTICES][3];
    604         double     L[NUMVERTICES];
     601        IssmDouble     Jdettria,dt;
     602        IssmDouble     surface_mass_balance_g,basal_melting_g,basal_melting_correction_g,thickness_g;
     603        IssmDouble     xyz_list[NUMVERTICES][3];
     604        IssmDouble     L[NUMVERTICES];
    605605        GaussTria* gauss=NULL;
    606606
    607607        /*Initialize Element vector*/
     
    649649
    650650        /*Intermediaries */
    651651        int        i,j,ig;
    652         double     Jdettria,dt;
    653         double     surface_mass_balance_g,basal_melting_g,thickness_g;
    654         double     xyz_list[NUMVERTICES][3];
    655         double     L[NUMVERTICES];
     652        IssmDouble     Jdettria,dt;
     653        IssmDouble     surface_mass_balance_g,basal_melting_g,thickness_g;
     654        IssmDouble     xyz_list[NUMVERTICES][3];
     655        IssmDouble     L[NUMVERTICES];
    656656        GaussTria* gauss=NULL;
    657657
    658658        /*Initialize Element vector*/
     
    695695        /*Intermediaries */
    696696        int        i,j,ig;
    697697        int        analysis_type;
    698         double     Jdet;
    699         double     xyz_list[NUMVERTICES][3];
    700         double     slope[2];
    701         double     basis[3];
     698        IssmDouble     Jdet;
     699        IssmDouble     xyz_list[NUMVERTICES][3];
     700        IssmDouble     slope[2];
     701        IssmDouble     basis[3];
    702702        GaussTria* gauss=NULL;
    703703
    704704        /*Initialize Element vector*/
     
    786786void  Tria::ComputeStressTensor(){
    787787
    788788        int         iv;
    789         double      xyz_list[NUMVERTICES][3];
    790         double      pressure,viscosity;
    791         double      epsilon[3]; /* epsilon=[exx,eyy,exy];*/
    792         double      sigma_xx[NUMVERTICES];
    793         double          sigma_yy[NUMVERTICES];
    794         double          sigma_zz[NUMVERTICES]={0,0,0};
    795         double      sigma_xy[NUMVERTICES];
    796         double          sigma_xz[NUMVERTICES]={0,0,0};
    797         double          sigma_yz[NUMVERTICES]={0,0,0};
     789        IssmDouble      xyz_list[NUMVERTICES][3];
     790        IssmDouble      pressure,viscosity;
     791        IssmDouble      epsilon[3]; /* epsilon=[exx,eyy,exy];*/
     792        IssmDouble      sigma_xx[NUMVERTICES];
     793        IssmDouble              sigma_yy[NUMVERTICES];
     794        IssmDouble              sigma_zz[NUMVERTICES]={0,0,0};
     795        IssmDouble      sigma_xy[NUMVERTICES];
     796        IssmDouble              sigma_xz[NUMVERTICES]={0,0,0};
     797        IssmDouble              sigma_yz[NUMVERTICES]={0,0,0};
    798798        GaussTria* gauss=NULL;
    799799
    800800        /* Get node coordinates and dof list: */
     
    947947}
    948948/*}}}*/
    949949/*FUNCTION Tria::GetArea {{{*/
    950 double Tria::GetArea(void){
     950IssmDouble Tria::GetArea(void){
    951951
    952         double area=0;
    953         double xyz_list[NUMVERTICES][3];
    954         double x1,y1,x2,y2,x3,y3;
     952        IssmDouble area=0;
     953        IssmDouble xyz_list[NUMVERTICES][3];
     954        IssmDouble x1,y1,x2,y2,x3,y3;
    955955
    956956        /*Get xyz list: */
    957957        GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES);
     
    10211021        _error_("Node provided not found among element nodes");
    10221022}
    10231023/*}}}*/
    1024 /*FUNCTION Tria::GetInputListOnVertices(double* pvalue,int enumtype) {{{*/
    1025 void Tria::GetInputListOnVertices(double* pvalue,int enumtype){
     1024/*FUNCTION Tria::GetInputListOnVertices(IssmDouble* pvalue,int enumtype) {{{*/
     1025void Tria::GetInputListOnVertices(IssmDouble* pvalue,int enumtype){
    10261026
    10271027        /*Intermediaries*/
    1028         double     value[NUMVERTICES];
     1028        IssmDouble     value[NUMVERTICES];
    10291029        GaussTria *gauss              = NULL;
    10301030
    10311031        /*Recover input*/
     
    10461046        delete gauss;
    10471047}
    10481048/*}}}*/
    1049 /*FUNCTION Tria::GetInputListOnVertices(double* pvalue,int enumtype,double defaultvalue) {{{*/
    1050 void Tria::GetInputListOnVertices(double* pvalue,int enumtype,double defaultvalue){
     1049/*FUNCTION Tria::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue) {{{*/
     1050void Tria::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue){
    10511051
    1052         double     value[NUMVERTICES];
     1052        IssmDouble     value[NUMVERTICES];
    10531053        GaussTria *gauss = NULL;
    10541054        Input     *input = inputs->GetInput(enumtype);
    10551055
     
    10721072        delete gauss;
    10731073}
    10741074/*}}}*/
    1075 /*FUNCTION Tria::GetInputListOnVertices(double* pvalue,int enumtype,double defaultvalue,int index) TO BE REMOVED{{{*/
    1076 void Tria::GetInputListOnVertices(double* pvalue,int enumtype,double defaultvalue,int index){
     1075/*FUNCTION Tria::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue,int index) TO BE REMOVED{{{*/
     1076void Tria::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue,int index){
    10771077
    1078         double     value[NUMVERTICES];
     1078        IssmDouble     value[NUMVERTICES];
    10791079        GaussTria *gauss = NULL;
    10801080        Input     *input = inputs->GetInput(enumtype);
    10811081
     
    10981098        delete gauss;
    10991099}
    11001100/*}}}*/
    1101 /*FUNCTION Tria::GetInputValue(double* pvalue,Node* node,int enumtype) {{{*/
    1102 void Tria::GetInputValue(double* pvalue,Node* node,int enumtype){
     1101/*FUNCTION Tria::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype) {{{*/
     1102void Tria::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){
    11031103
    11041104        Input* input=inputs->GetInput(enumtype);
    11051105        if(!input) _error_("No input of type %s found in tria",EnumToStringx(enumtype));
     
    11491149
    11501150}
    11511151/*}}}*/
    1152 /*FUNCTION Tria::GetStrainRate2d(double* epsilon,double* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input){{{*/
    1153 void Tria::GetStrainRate2d(double* epsilon,double* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input){
     1152/*FUNCTION Tria::GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input){{{*/
     1153void Tria::GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input){
    11541154        /*Compute the 2d Strain Rate (3 components):
    11551155         * epsilon=[exx eyy exy] */
    11561156
    11571157        int i;
    1158         double epsilonvx[3];
    1159         double epsilonvy[3];
     1158        IssmDouble epsilonvx[3];
     1159        IssmDouble epsilonvy[3];
    11601160
    11611161        /*Check that both inputs have been found*/
    11621162        if (!vx_input || !vy_input){
     
    12251225}
    12261226/*}}}*/
    12271227/*FUNCTION Tria::InputArtificialNoise{{{*/
    1228 void  Tria::InputArtificialNoise(int enum_type,double min,double max){
     1228void  Tria::InputArtificialNoise(int enum_type,IssmDouble min,IssmDouble max){
    12291229
    12301230        Input* input=NULL;
    12311231
     
    12381238}
    12391239/*}}}*/
    12401240/*FUNCTION Tria::InputConvergence{{{*/
    1241 bool Tria::InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums){
     1241bool Tria::InputConvergence(IssmDouble* eps, int* enums,int num_enums,int* criterionenums,IssmDouble* criterionvalues,int num_criterionenums){
    12421242
    12431243        bool    converged=true;
    12441244        int     i;
     
    13051305}
    13061306/*}}}*/
    13071307/*FUNCTION Tria::InputScale{{{*/
    1308 void  Tria::InputScale(int enum_type,double scale_factor){
     1308void  Tria::InputScale(int enum_type,IssmDouble scale_factor){
    13091309
    13101310        Input* input=NULL;
    13111311
     
    13181318}
    13191319/*}}}*/
    13201320/*FUNCTION Tria::InputToResult{{{*/
    1321 void  Tria::InputToResult(int enum_type,int step,double time){
     1321void  Tria::InputToResult(int enum_type,int step,IssmDouble time){
    13221322
    13231323        int    i;
    13241324        Input *input = NULL;
     
    13491349        this->inputs->AddInput(new IntInput(name,constant));
    13501350}
    13511351/*}}}*/
    1352 /*FUNCTION Tria::InputUpdateFromConstant(double value, int name);{{{*/
    1353 void  Tria::InputUpdateFromConstant(double constant, int name){
     1352/*FUNCTION Tria::InputUpdateFromConstant(IssmDouble value, int name);{{{*/
     1353void  Tria::InputUpdateFromConstant(IssmDouble constant, int name){
    13541354        /*Check that name is an element input*/
    13551355        if (!IsInput(name)) return;
    13561356
     
    13731373        /*Intermediaries*/
    13741374        int    i,j;
    13751375        int    tria_vertex_ids[3];
    1376         double nodeinputs[3];
    1377         double cmmininputs[3];
    1378         double cmmaxinputs[3];
     1376        IssmDouble nodeinputs[3];
     1377        IssmDouble cmmininputs[3];
     1378        IssmDouble cmmaxinputs[3];
    13791379        bool   control_analysis=false;
    13801380        int    num_control_type;
    1381         double yts;
     1381        IssmDouble yts;
    13821382        int    num_cm_responses;
    13831383   
    13841384        /*Get parameters: */
     
    14541454}
    14551455/*}}}*/
    14561456/*FUNCTION Tria::InputUpdateFromSolution {{{*/
    1457 void  Tria::InputUpdateFromSolution(double* solution){
     1457void  Tria::InputUpdateFromSolution(IssmDouble* solution){
    14581458
    14591459        /*retrive parameters: */
    14601460        int analysis_type;
     
    15091509}
    15101510/*}}}*/
    15111511/*FUNCTION Tria::InputUpdateFromSolutionOneDof{{{*/
    1512 void  Tria::InputUpdateFromSolutionOneDof(double* solution,int enum_type){
     1512void  Tria::InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type){
    15131513
    15141514        const int numdof          = NDOF1*NUMVERTICES;
    15151515
    15161516        int*      doflist=NULL;
    1517         double    values[numdof];
     1517        IssmDouble    values[numdof];
    15181518
    15191519        /*Get dof list: */
    15201520        GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     
    15331533}
    15341534/*}}}*/
    15351535/*FUNCTION Tria::InputUpdateFromSolutionPrognostic{{{*/
    1536 void  Tria::InputUpdateFromSolutionPrognostic(double* solution){
     1536void  Tria::InputUpdateFromSolutionPrognostic(IssmDouble* solution){
    15371537
    15381538        /*Intermediaries*/
    15391539        const int numdof = NDOF1*NUMVERTICES;
    15401540
    15411541        int       i,hydroadjustment;
    15421542        int*      doflist=NULL;
    1543         double    rho_ice,rho_water,minthickness;
    1544         double    newthickness[numdof];
    1545         double    newbed[numdof];
    1546         double    newsurface[numdof];
    1547         double    oldbed[NUMVERTICES];
    1548         double    oldsurface[NUMVERTICES];
    1549         double    oldthickness[NUMVERTICES];
     1543        IssmDouble    rho_ice,rho_water,minthickness;
     1544        IssmDouble    newthickness[numdof];
     1545        IssmDouble    newbed[numdof];
     1546        IssmDouble    newsurface[numdof];
     1547        IssmDouble    oldbed[NUMVERTICES];
     1548        IssmDouble    oldsurface[NUMVERTICES];
     1549        IssmDouble    oldthickness[NUMVERTICES];
    15501550
    15511551        /*Get dof list: */
    15521552        GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     
    15991599        xDelete<int>(doflist);
    16001600}
    16011601/*}}}*/
    1602 /*FUNCTION Tria::InputUpdateFromVector(double* vector, int name, int type);{{{*/
    1603 void  Tria::InputUpdateFromVector(double* vector, int name, int type){
     1602/*FUNCTION Tria::InputUpdateFromVector(IssmDouble* vector, int name, int type);{{{*/
     1603void  Tria::InputUpdateFromVector(IssmDouble* vector, int name, int type){
    16041604
    16051605        /*Check that name is an element input*/
    16061606        if (!IsInput(name)) return;
     
    16101610                case VertexEnum:
    16111611
    16121612                        /*New TriaP1Input*/
    1613                         double values[3];
     1613                        IssmDouble values[3];
    16141614
    16151615                        /*Get values on the 3 vertices*/
    16161616                        for (int i=0;i<3;i++){
     
    16411641        _error_(" not supported yet!");
    16421642}
    16431643/*}}}*/
    1644 /*FUNCTION Tria::InputCreate(double scalar,int enum,int code);{{{*/
    1645 void Tria::InputCreate(double scalar,int name,int code){
     1644/*FUNCTION Tria::InputCreate(IssmDouble scalar,int enum,int code);{{{*/
     1645void Tria::InputCreate(IssmDouble scalar,int name,int code){
    16461646
    16471647        /*Check that name is an element input*/
    16481648        if (!IsInput(name)) return;
     
    16531653        else if ((code==6) || (code==2)){ //integer
    16541654                this->inputs->AddInput(new IntInput(name,(int)scalar));
    16551655        }
    1656         else if ((code==7) || (code==3)){ //double
     1656        else if ((code==7) || (code==3)){ //IssmDouble
    16571657                this->inputs->AddInput(new DoubleInput(name,(int)scalar));
    16581658        }
    16591659        else _error_("%s%i"," could not recognize nature of vector from code ",code);
    16601660
    16611661}
    16621662/*}}}*/
    1663 /*FUNCTION Tria::InputCreate(double* vector,int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){{{*/
    1664 void Tria::InputCreate(double* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){//index into elements
     1663/*FUNCTION Tria::InputCreate(IssmDouble* vector,int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){{{*/
     1664void Tria::InputCreate(IssmDouble* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){//index into elements
    16651665
    16661666        /*Intermediaries*/
    16671667        int    i,j,t;
    16681668        int    tria_vertex_ids[3];
    16691669        int    row;
    1670         double nodeinputs[3];
    1671         double time;
     1670        IssmDouble nodeinputs[3];
     1671        IssmDouble time;
    16721672        TransientInput* transientinput=NULL;
    16731673        int    numberofvertices;
    16741674        int    numberofelements;
    1675         double yts;
     1675        IssmDouble yts;
    16761676
    16771677
    16781678        /*Fetch parameters: */
     
    16921692                if(M==numberofvertices){
    16931693
    16941694                        /*create input values: */
    1695                         for(i=0;i<3;i++)nodeinputs[i]=(double)vector[tria_vertex_ids[i]-1];
     1695                        for(i=0;i<3;i++)nodeinputs[i]=(IssmDouble)vector[tria_vertex_ids[i]-1];
    16961696
    16971697                        /*process units: */
    16981698                        UnitConversion(&nodeinputs[0], 3 ,ExtToIuEnum, vector_enum);
     
    17071707                                /*create input values: */
    17081708                                for(i=0;i<3;i++){
    17091709                                        row=tria_vertex_ids[i]-1;
    1710                                         nodeinputs[i]=(double)vector[N*row+t];
     1710                                        nodeinputs[i]=(IssmDouble)vector[N*row+t];
    17111711                                }
    17121712
    17131713                                /*process units: */
    17141714                                UnitConversion(&nodeinputs[0], 3 ,ExtToIuEnum, vector_enum);
    17151715
    17161716                                /*time? :*/
    1717                                 time=(double)vector[(M-1)*N+t]*yts;
     1717                                time=(IssmDouble)vector[(M-1)*N+t]*yts;
    17181718
    17191719                                if(t==0) transientinput=new TransientInput(vector_enum);
    17201720                                transientinput->AddTimeInput(new TriaP1Input(vector_enum,nodeinputs),time);
     
    17351735                        else if (code==6){ //integer
    17361736                                this->inputs->AddInput(new IntInput(vector_enum,(int)vector[index]));
    17371737                        }
    1738                         else if (code==7){ //double
    1739                                 this->inputs->AddInput(new DoubleInput(vector_enum,(double)vector[index]));
     1738                        else if (code==7){ //IssmDouble
     1739                                this->inputs->AddInput(new DoubleInput(vector_enum,(IssmDouble)vector[index]));
    17401740                        }
    17411741                        else _error_("%s%i"," could not recognize nature of vector from code ",code);
    17421742                }
     
    18161816}
    18171817/*}}}*/
    18181818/*FUNCTION Tria::IsNodeOnShelfFromFlags {{{*/
    1819 bool   Tria::IsNodeOnShelfFromFlags(double* flags){
     1819bool   Tria::IsNodeOnShelfFromFlags(IssmDouble* flags){
    18201820
    18211821        int  i;
    18221822        bool shelf=false;
     
    18391839}
    18401840/*}}}*/
    18411841/*FUNCTION Tria::ListResultsInfo{{{*/
    1842 void Tria::ListResultsInfo(int** in_resultsenums,int** in_resultssizes,double** in_resultstimes,int** in_resultssteps,int* in_num_results){
     1842void Tria::ListResultsInfo(int** in_resultsenums,int** in_resultssizes,IssmDouble** in_resultstimes,int** in_resultssteps,int* in_num_results){
    18431843
    18441844        /*Intermediaries*/
    18451845        int     i;
    18461846        int     numberofresults = 0;
    18471847        int     *resultsenums   = NULL;
    18481848        int     *resultssizes   = NULL;
    1849         double  *resultstimes   = NULL;
     1849        IssmDouble  *resultstimes   = NULL;
    18501850        int     *resultssteps   = NULL;
    18511851
    18521852        /*Checks*/
     
    18631863                /*Allocate output*/
    18641864                resultsenums=xNew<int>(numberofresults);
    18651865                resultssizes=xNew<int>(numberofresults);
    1866                 resultstimes=xNew<double>(numberofresults);
     1866                resultstimes=xNew<IssmDouble>(numberofresults);
    18671867                resultssteps=xNew<int>(numberofresults);
    18681868
    18691869                /*populate enums*/
     
    18901890
    18911891}/*}}}*/
    18921892/*FUNCTION Tria::MigrateGroundingLine{{{*/
    1893 void  Tria::MigrateGroundingLine(double* old_floating_ice,double* sheet_ungrounding){
     1893void  Tria::MigrateGroundingLine(IssmDouble* old_floating_ice,IssmDouble* sheet_ungrounding){
    18941894
    18951895        int     i,migration_style,unground;
    18961896        bool    elementonshelf = false;
    1897         double  bed_hydro,yts,gl_melting_rate;
    1898         double  rho_water,rho_ice,density;
    1899         double  melting[NUMVERTICES];
    1900         double  h[NUMVERTICES],s[NUMVERTICES],b[NUMVERTICES],ba[NUMVERTICES];
     1897        IssmDouble  bed_hydro,yts,gl_melting_rate;
     1898        IssmDouble  rho_water,rho_ice,density;
     1899        IssmDouble  melting[NUMVERTICES];
     1900        IssmDouble  h[NUMVERTICES],s[NUMVERTICES],b[NUMVERTICES],ba[NUMVERTICES];
    19011901
    19021902        /*Recover info at the vertices: */
    19031903        parameters->FindParam(&migration_style,GroundinglineMigrationEnum);
     
    19721972}
    19731973/*}}}*/
    19741974/*FUNCTION Tria::NodalValue {{{*/
    1975 int    Tria::NodalValue(double* pvalue, int index, int natureofdataenum,bool process_units){
     1975int    Tria::NodalValue(IssmDouble* pvalue, int index, int natureofdataenum,bool process_units){
    19761976
    19771977        int i;
    19781978        int found=0;
    1979         double value;
     1979        IssmDouble value;
    19801980        Input* data=NULL;
    19811981        GaussTria *gauss                            = NULL;
    19821982
     
    20572057void  Tria::PotentialSheetUngrounding(Vector* potential_sheet_ungrounding){
    20582058
    20592059        int     i;
    2060         double  h[NUMVERTICES],ba[NUMVERTICES];
    2061         double  bed_hydro;
    2062         double  rho_water,rho_ice,density;
     2060        IssmDouble  h[NUMVERTICES],ba[NUMVERTICES];
     2061        IssmDouble  bed_hydro;
     2062        IssmDouble  rho_water,rho_ice,density;
    20632063        bool    elementonshelf = false;
    20642064
    20652065        /*material parameters: */
     
    20832083}
    20842084/*}}}*/
    20852085/*FUNCTION Tria::PositiveDegreeDay{{{*/
    2086 void  Tria::PositiveDegreeDay(double* pdds,double* pds,double signorm){
     2086void  Tria::PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){
    20872087
    20882088   int    i,iqj,imonth;
    2089    double agd[NUMVERTICES];             // surface mass balance
    2090    double saccu[NUMVERTICES] = {0};     // yearly surface accumulation
    2091    double smelt[NUMVERTICES] = {0};     // yearly melt
    2092    double precrunoff[NUMVERTICES];      // yearly runoff
    2093    double prect; // total precipitation during 1 year taking into account des. ef.
    2094    double water; //water=rain + snowmelt
    2095    double runoff; //meltwater only, does not include rain
    2096    double sconv; //rhow_rain/rhoi / 12 months
     2089   IssmDouble agd[NUMVERTICES];             // surface mass balance
     2090   IssmDouble saccu[NUMVERTICES] = {0};     // yearly surface accumulation
     2091   IssmDouble smelt[NUMVERTICES] = {0};     // yearly melt
     2092   IssmDouble precrunoff[NUMVERTICES];      // yearly runoff
     2093   IssmDouble prect; // total precipitation during 1 year taking into account des. ef.
     2094   IssmDouble water; //water=rain + snowmelt
     2095   IssmDouble runoff; //meltwater only, does not include rain
     2096   IssmDouble sconv; //rhow_rain/rhoi / 12 months
    20972097
    2098    double rho_water,rho_ice,density;
    2099    double lapser=6.5/1000, sealev=0;    // lapse rate. degrees per meter. 7.5 lev's 99 paper, 9 Marshall 99 paper
    2100    double desfac = 0.5;                 // desert elevation factor
    2101    double s0p[NUMVERTICES]={0};         // should be set to elevation from precip source
    2102    double s0t[NUMVERTICES]={0};         // should be set to elevation from temperature source
    2103    double st;             // elevation between altitude of the temp record and current altitude
    2104    double sp;             // elevation between altitude of the prec record and current altitude
     2098   IssmDouble rho_water,rho_ice,density;
     2099   IssmDouble lapser=6.5/1000, sealev=0;    // lapse rate. degrees per meter. 7.5 lev's 99 paper, 9 Marshall 99 paper
     2100   IssmDouble desfac = 0.5;                 // desert elevation factor
     2101   IssmDouble s0p[NUMVERTICES]={0};         // should be set to elevation from precip source
     2102   IssmDouble s0t[NUMVERTICES]={0};         // should be set to elevation from temperature source
     2103   IssmDouble st;             // elevation between altitude of the temp record and current altitude
     2104   IssmDouble sp;             // elevation between altitude of the prec record and current altitude
    21052105
    21062106   // PDD and PD constants and variables
    2107    double siglim;          // sigma limit for the integration which is equal to 2.5 sigmanorm
    2108    double signormc = signorm - 0.5;     // sigma of the temperature distribution for cloudy day
    2109    double siglimc, siglim0, siglim0c;
    2110    double PDup, pddsig, PDCUT = 2.0; // PDcut: rain/snow cutoff temperature (C)
    2111    double DT = 0.02;
    2112    double pddt, pd; // pd: snow/precip fraction, precipitation falling as snow
     2107   IssmDouble siglim;          // sigma limit for the integration which is equal to 2.5 sigmanorm
     2108   IssmDouble signormc = signorm - 0.5;     // sigma of the temperature distribution for cloudy day
     2109   IssmDouble siglimc, siglim0, siglim0c;
     2110   IssmDouble PDup, pddsig, PDCUT = 2.0; // PDcut: rain/snow cutoff temperature (C)
     2111   IssmDouble DT = 0.02;
     2112   IssmDouble pddt, pd; // pd: snow/precip fraction, precipitation falling as snow
    21132113   
    2114    double q, qmpt; // q is desert/elev. fact, hnpfac is huybrect fact, and pd is normal dist.
    2115    double qm[NUMVERTICES] = {0};        // snow part of the precipitation
    2116    double qmt[NUMVERTICES] = {0};       // precipitation without desertification effect adjustment
    2117    double qmp[NUMVERTICES] = {0};       // desertification taken into account
    2118    double pdd[NUMVERTICES] = {0};     
    2119    double frzndd[NUMVERTICES] = {0}; 
     2114   IssmDouble q, qmpt; // q is desert/elev. fact, hnpfac is huybrect fact, and pd is normal dist.
     2115   IssmDouble qm[NUMVERTICES] = {0};        // snow part of the precipitation
     2116   IssmDouble qmt[NUMVERTICES] = {0};       // precipitation without desertification effect adjustment
     2117   IssmDouble qmp[NUMVERTICES] = {0};       // desertification taken into account
     2118   IssmDouble pdd[NUMVERTICES] = {0};     
     2119   IssmDouble frzndd[NUMVERTICES] = {0}; 
    21202120
    2121    double tstar;                        // monthly mean surface temp
    2122    double Tsum[NUMVERTICES]= {0};       // average summer (JJA) temperature
    2123    double Tsurf[NUMVERTICES] = {0};     // average annual temperature   
     2121   IssmDouble tstar;                        // monthly mean surface temp
     2122   IssmDouble Tsum[NUMVERTICES]= {0};       // average summer (JJA) temperature
     2123   IssmDouble Tsurf[NUMVERTICES] = {0};     // average annual temperature   
    21242124   
    2125    double h[NUMVERTICES],s[NUMVERTICES],ttmp[NUMVERTICES],prectmp[NUMVERTICES]; // ,b[NUMVERTICES]
    2126    double t[NUMVERTICES+1][12],prec[NUMVERTICES+1][12];
    2127    double deltm=1/12;
     2125   IssmDouble h[NUMVERTICES],s[NUMVERTICES],ttmp[NUMVERTICES],prectmp[NUMVERTICES]; // ,b[NUMVERTICES]
     2126   IssmDouble t[NUMVERTICES+1][12],prec[NUMVERTICES+1][12];
     2127   IssmDouble deltm=1/12;
    21282128   int    ismon[12]={12,1,2,3,4,5,6,7,8,9,10,11};
    21292129
    2130    double snwm;  // snow that could have been melted in a year.
    2131    double snwmf; //  ablation factor for snow per positive degree day.
    2132    double smf;   //  ablation factor for ice per pdd (Braithwaite 1995 from tarasov 2002).
     2130   IssmDouble snwm;  // snow that could have been melted in a year.
     2131   IssmDouble snwmf; //  ablation factor for snow per positive degree day.
     2132   IssmDouble smf;   //  ablation factor for ice per pdd (Braithwaite 1995 from tarasov 2002).
    21332133
    2134    double dfrz=1.5, CovrLm=2009./3.35e+5, dCovrLm=dfrz*CovrLm; //m*J kg^-1 C^-1 /(J kg^-1)=m/C yr
    2135    double supice,supcap,diffndd;
    2136    double fsupT=0.5,  fsupndd=0.5;  // Tsurf mode factors for supice
    2137    double pddtj[NUMVERTICES], hmx2;
     2134   IssmDouble dfrz=1.5, CovrLm=2009./3.35e+5, dCovrLm=dfrz*CovrLm; //m*J kg^-1 C^-1 /(J kg^-1)=m/C yr
     2135   IssmDouble supice,supcap,diffndd;
     2136   IssmDouble fsupT=0.5,  fsupndd=0.5;  // Tsurf mode factors for supice
     2137   IssmDouble pddtj[NUMVERTICES], hmx2;
    21382138
    21392139   /*Recover info at the vertices: */
    21402140   GetInputListOnVertices(&h[0],ThicknessEnum);
     
    21452145        /*Recover monthly temperatures*/
    21462146        Input*     input=inputs->GetInput(SurfaceforcingsMonthlytemperaturesEnum); _assert_(input);
    21472147        GaussTria* gauss=new GaussTria();
    2148         double time,yts;
     2148        IssmDouble time,yts;
    21492149        this->parameters->FindParam(&time,TimeEnum);
    21502150        this->parameters->FindParam(&yts,ConstantsYtsEnum);
    21512151        for(int month=0;month<12;month++){
     
    23292329}
    23302330/*}}}*/
    23312331/*FUNCTION Tria::RequestedOutput{{{*/
    2332 void Tria::RequestedOutput(int output_enum,int step,double time){
     2332void Tria::RequestedOutput(int output_enum,int step,IssmDouble time){
    23332333
    23342334        if(IsInput(output_enum)){
    23352335                /*just transfer this input to results, and we are done: */
     
    23632363}
    23642364/*}}}*/
    23652365/*FUNCTION Tria::SmearFunction {{{*/
    2366 void  Tria::SmearFunction(Vector*  smearedvector,double (*WeightFunction)(double distance,double radius),double radius){
     2366void  Tria::SmearFunction(Vector*  smearedvector,IssmDouble (*WeightFunction)(IssmDouble distance,IssmDouble radius),IssmDouble radius){
    23672367        _error_("not implemented yet");
    23682368
    23692369}
     
    23852385}
    23862386/*}}}*/
    23872387/*FUNCTION Tria::SurfaceArea {{{*/
    2388 double Tria::SurfaceArea(void){
     2388IssmDouble Tria::SurfaceArea(void){
    23892389
    23902390        int    i;
    2391         double S;
    2392         double normal[3];
    2393         double v13[3],v23[3];
    2394         double xyz_list[NUMVERTICES][3];
     2391        IssmDouble S;
     2392        IssmDouble normal[3];
     2393        IssmDouble v13[3],v23[3];
     2394        IssmDouble xyz_list[NUMVERTICES][3];
    23952395
    23962396        /*If on water, return 0: */
    23972397        if(IsOnWater())return 0;
     
    24072407        normal[1]=v13[2]*v23[0]-v13[0]*v23[2];
    24082408        normal[2]=v13[0]*v23[1]-v13[1]*v23[0];
    24092409
    2410         S = 0.5 * sqrt(pow(normal[0],(double)2)+pow(normal[1],(double)2)+pow(normal[2],(double)2));
     2410        S = 0.5 * sqrt(pow(normal[0],(IssmDouble)2)+pow(normal[1],(IssmDouble)2)+pow(normal[2],(IssmDouble)2));
    24112411
    24122412        /*Return: */
    24132413        return S;
    24142414}
    24152415/*}}}*/
    24162416/*FUNCTION Tria::SurfaceNormal{{{*/
    2417 void Tria::SurfaceNormal(double* surface_normal, double xyz_list[3][3]){
     2417void Tria::SurfaceNormal(IssmDouble* surface_normal, IssmDouble xyz_list[3][3]){
    24182418
    24192419        int i;
    2420         double v13[3],v23[3];
    2421         double normal[3];
    2422         double normal_norm;
     2420        IssmDouble v13[3],v23[3];
     2421        IssmDouble normal[3];
     2422        IssmDouble normal_norm;
    24232423
    24242424        for (i=0;i<3;i++){
    24252425                v13[i]=xyz_list[0][i]-xyz_list[2][i];
     
    24302430        normal[1]=v13[2]*v23[0]-v13[0]*v23[2];
    24312431        normal[2]=v13[0]*v23[1]-v13[1]*v23[0];
    24322432
    2433         normal_norm=sqrt( pow(normal[0],(double)2)+pow(normal[1],(double)2)+pow(normal[2],(double)2) );
     2433        normal_norm=sqrt( pow(normal[0],(IssmDouble)2)+pow(normal[1],(IssmDouble)2)+pow(normal[2],(IssmDouble)2) );
    24342434
    24352435        *(surface_normal)=normal[0]/normal_norm;
    24362436        *(surface_normal+1)=normal[1]/normal_norm;
     
    24382438}
    24392439/*}}}*/
    24402440/*FUNCTION Tria::TimeAdapt{{{*/
    2441 double  Tria::TimeAdapt(void){
     2441IssmDouble  Tria::TimeAdapt(void){
    24422442
    24432443        /*intermediary: */
    24442444        int    i;
    2445         double C,dt;
    2446         double dx,dy;
    2447         double maxx,minx;
    2448         double maxy,miny;
    2449         double maxabsvx,maxabsvy;
    2450         double xyz_list[NUMVERTICES][3];
     2445        IssmDouble C,dt;
     2446        IssmDouble dx,dy;
     2447        IssmDouble maxx,minx;
     2448        IssmDouble maxy,miny;
     2449        IssmDouble maxabsvx,maxabsvy;
     2450        IssmDouble xyz_list[NUMVERTICES][3];
    24512451
    24522452        /*get CFL coefficient:*/
    24532453        this->parameters->FindParam(&C,TimesteppingCflCoefficientEnum);
     
    24912491        int    tria_node_ids[3];
    24922492        int    tria_vertex_ids[3];
    24932493        int    tria_type;
    2494         double nodeinputs[3];
    2495         double yts;
     2494        IssmDouble nodeinputs[3];
     2495        IssmDouble yts;
    24962496        int    progstabilization,balancestabilization;
    24972497        bool   dakota_analysis;
    24982498
     
    25842584}
    25852585/*}}}*/
    25862586/*FUNCTION Tria::UpdatePotentialSheetUngrounding{{{*/
    2587 int Tria::UpdatePotentialSheetUngrounding(double* vertices_potentially_ungrounding,Vector* vec_nodes_on_iceshelf,double* nodes_on_iceshelf){
     2587int Tria::UpdatePotentialSheetUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){
    25882588
    25892589        int i;
    25902590        int nflipped=0;
     
    26062606
    26072607#ifdef _HAVE_RESPONSES_
    26082608/*FUNCTION Tria::IceVolume {{{*/
    2609 double Tria::IceVolume(void){
     2609IssmDouble Tria::IceVolume(void){
    26102610
    26112611        /*The volume of a troncated prism is base * 1/3 sum(length of edges)*/
    2612         double base,surface,bed;
    2613         double xyz_list[NUMVERTICES][3];
     2612        IssmDouble base,surface,bed;
     2613        IssmDouble xyz_list[NUMVERTICES][3];
    26142614
    26152615        if(IsOnWater())return 0;
    26162616
     
    26322632}
    26332633/*}}}*/
    26342634/*FUNCTION Tria::MassFlux {{{*/
    2635 double Tria::MassFlux( double* segment,bool process_units){
     2635IssmDouble Tria::MassFlux( IssmDouble* segment,bool process_units){
    26362636
    26372637        const int    numdofs=2;
    26382638
    26392639        int        i,dim;
    2640         double     mass_flux=0;
    2641         double     xyz_list[NUMVERTICES][3];
    2642         double     normal[2];
    2643         double     length,rho_ice;
    2644         double     x1,y1,x2,y2,h1,h2;
    2645         double     vx1,vx2,vy1,vy2;
     2640        IssmDouble     mass_flux=0;
     2641        IssmDouble     xyz_list[NUMVERTICES][3];
     2642        IssmDouble     normal[2];
     2643        IssmDouble     length,rho_ice;
     2644        IssmDouble     x1,y1,x2,y2,h1,h2;
     2645        IssmDouble     vx1,vx2,vy1,vy2;
    26462646        GaussTria* gauss_1=NULL;
    26472647        GaussTria* gauss_2=NULL;
    26482648
     
    27042704}
    27052705/*}}}*/
    27062706/*FUNCTION Tria::MaxAbsVx{{{*/
    2707 void  Tria::MaxAbsVx(double* pmaxabsvx, bool process_units){
     2707void  Tria::MaxAbsVx(IssmDouble* pmaxabsvx, bool process_units){
    27082708
    27092709        /*Get maximum:*/
    2710         double maxabsvx=this->inputs->MaxAbs(VxEnum);
     2710        IssmDouble maxabsvx=this->inputs->MaxAbs(VxEnum);
    27112711
    27122712        /*process units if requested: */
    27132713        if(process_units) maxabsvx=UnitConversion(maxabsvx,IuToExtEnum,VxEnum);
     
    27172717}
    27182718/*}}}*/
    27192719/*FUNCTION Tria::MaxAbsVy{{{*/
    2720 void  Tria::MaxAbsVy(double* pmaxabsvy, bool process_units){
     2720void  Tria::MaxAbsVy(IssmDouble* pmaxabsvy, bool process_units){
    27212721
    27222722        /*Get maximum:*/
    2723         double maxabsvy=this->inputs->MaxAbs(VyEnum);
     2723        IssmDouble maxabsvy=this->inputs->MaxAbs(VyEnum);
    27242724
    27252725        /*process units if requested: */
    27262726        if(process_units) maxabsvy=UnitConversion(maxabsvy,IuToExtEnum,VyEnum);
     
    27302730}
    27312731/*}}}*/
    27322732/*FUNCTION Tria::MaxAbsVz{{{*/
    2733 void  Tria::MaxAbsVz(double* pmaxabsvz, bool process_units){
     2733void  Tria::MaxAbsVz(IssmDouble* pmaxabsvz, bool process_units){
    27342734
    27352735        /*Get maximum:*/
    2736         double maxabsvz=this->inputs->MaxAbs(VzEnum);
     2736        IssmDouble maxabsvz=this->inputs->MaxAbs(VzEnum);
    27372737
    27382738        /*process units if requested: */
    27392739        if(process_units) maxabsvz=UnitConversion(maxabsvz,IuToExtEnum,VyEnum);
     
    27432743}
    27442744/*}}}*/
    27452745/*FUNCTION Tria::MaxVel{{{*/
    2746 void  Tria::MaxVel(double* pmaxvel, bool process_units){
     2746void  Tria::MaxVel(IssmDouble* pmaxvel, bool process_units){
    27472747
    27482748        /*Get maximum:*/
    2749         double maxvel=this->inputs->Max(VelEnum);
     2749        IssmDouble maxvel=this->inputs->Max(VelEnum);
    27502750
    27512751        /*process units if requested: */
    27522752        if(process_units) maxvel=UnitConversion(maxvel,IuToExtEnum,VelEnum);
     
    27562756}
    27572757/*}}}*/
    27582758/*FUNCTION Tria::MaxVx{{{*/
    2759 void  Tria::MaxVx(double* pmaxvx, bool process_units){
     2759void  Tria::MaxVx(IssmDouble* pmaxvx, bool process_units){
    27602760
    27612761        /*Get maximum:*/
    2762         double maxvx=this->inputs->Max(VxEnum);
     2762        IssmDouble maxvx=this->inputs->Max(VxEnum);
    27632763
    27642764        /*process units if requested: */
    27652765        if(process_units) maxvx=UnitConversion(maxvx,IuToExtEnum,VxEnum);
     
    27692769}
    27702770/*}}}*/
    27712771/*FUNCTION Tria::MaxVy{{{*/
    2772 void  Tria::MaxVy(double* pmaxvy, bool process_units){
     2772void  Tria::MaxVy(IssmDouble* pmaxvy, bool process_units){
    27732773
    27742774        /*Get maximum:*/
    2775         double maxvy=this->inputs->Max(VyEnum);
     2775        IssmDouble maxvy=this->inputs->Max(VyEnum);
    27762776
    27772777        /*process units if requested: */
    27782778        if(process_units) maxvy=UnitConversion(maxvy,IuToExtEnum,VyEnum);
     
    27832783}
    27842784/*}}}*/
    27852785/*FUNCTION Tria::MaxVz{{{*/
    2786 void  Tria::MaxVz(double* pmaxvz, bool process_units){
     2786void  Tria::MaxVz(IssmDouble* pmaxvz, bool process_units){
    27872787
    27882788        /*Get maximum:*/
    2789         double maxvz=this->inputs->Max(VzEnum);
     2789        IssmDouble maxvz=this->inputs->Max(VzEnum);
    27902790
    27912791        /*process units if requested: */
    27922792        if(process_units) maxvz=UnitConversion(maxvz,IuToExtEnum,VzEnum);
     
    27962796}
    27972797/*}}}*/
    27982798/*FUNCTION Tria::MinVel{{{*/
    2799 void  Tria::MinVel(double* pminvel, bool process_units){
     2799void  Tria::MinVel(IssmDouble* pminvel, bool process_units){
    28002800
    28012801        /*Get minimum:*/
    2802         double minvel=this->inputs->Min(VelEnum);
     2802        IssmDouble minvel=this->inputs->Min(VelEnum);
    28032803
    28042804        /*process units if requested: */
    28052805        if(process_units) minvel=UnitConversion(minvel,IuToExtEnum,VelEnum);
     
    28092809}
    28102810/*}}}*/
    28112811/*FUNCTION Tria::MinVx{{{*/
    2812 void  Tria::MinVx(double* pminvx, bool process_units){
     2812void  Tria::MinVx(IssmDouble* pminvx, bool process_units){
    28132813
    28142814        /*Get minimum:*/
    2815         double minvx=this->inputs->Min(VxEnum);
     2815        IssmDouble minvx=this->inputs->Min(VxEnum);
    28162816
    28172817        /*process units if requested: */
    28182818        if(process_units) minvx=UnitConversion(minvx,IuToExtEnum,VxEnum);
     
    28222822}
    28232823/*}}}*/
    28242824/*FUNCTION Tria::MinVy{{{*/
    2825 void  Tria::MinVy(double* pminvy, bool process_units){
     2825void  Tria::MinVy(IssmDouble* pminvy, bool process_units){
    28262826
    28272827        /*Get minimum:*/
    2828         double minvy=this->inputs->Min(VyEnum);
     2828        IssmDouble minvy=this->inputs->Min(VyEnum);
    28292829
    28302830        /*process units if requested: */
    28312831        if(process_units) minvy=UnitConversion(minvy,IuToExtEnum,VyEnum);
     
    28352835}
    28362836/*}}}*/
    28372837/*FUNCTION Tria::MinVz{{{*/
    2838 void  Tria::MinVz(double* pminvz, bool process_units){
     2838void  Tria::MinVz(IssmDouble* pminvz, bool process_units){
    28392839
    28402840        /*Get minimum:*/
    2841         double minvz=this->inputs->Min(VzEnum);
     2841        IssmDouble minvz=this->inputs->Min(VzEnum);
    28422842
    28432843        /*process units if requested: */
    28442844        if(process_units) minvz=UnitConversion(minvz,IuToExtEnum,VzEnum);
     
    28482848}
    28492849/*}}}*/
    28502850/*FUNCTION Tria::ElementResponse{{{*/
    2851 void Tria::ElementResponse(double* presponse,int response_enum,bool process_units){
     2851void Tria::ElementResponse(IssmDouble* presponse,int response_enum,bool process_units){
    28522852
    28532853        switch(response_enum){
    28542854                case MaterialsRheologyBbarEnum:
     
    28572857                case VelEnum:
    28582858
    28592859                        /*Get input:*/
    2860                         double vel;
     2860                        IssmDouble vel;
    28612861                        Input* vel_input;
    28622862
    28632863                        vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input);
     
    28992899
    29002900        /*Intermediaries*/
    29012901        int        i,j,ig;
    2902         double     xyz_list[NUMVERTICES][3];
    2903         double     viscosity,newviscosity,oldviscosity;
    2904         double     viscosity_overshoot,thickness,Jdet;
    2905         double     epsilon[3],oldepsilon[3];    /* epsilon=[exx,eyy,exy];    */
    2906         double     B[3][numdof];
    2907         double     Bprime[3][numdof];
    2908         double     D[3][3]   = {0.0};
    2909         double     D_scalar;
     2902        IssmDouble     xyz_list[NUMVERTICES][3];
     2903        IssmDouble     viscosity,newviscosity,oldviscosity;
     2904        IssmDouble     viscosity_overshoot,thickness,Jdet;
     2905        IssmDouble     epsilon[3],oldepsilon[3];    /* epsilon=[exx,eyy,exy];    */
     2906        IssmDouble     B[3][numdof];
     2907        IssmDouble     Bprime[3][numdof];
     2908        IssmDouble     D[3][3]   = {0.0};
     2909        IssmDouble     D_scalar;
    29102910        GaussTria *gauss = NULL;
    29112911
    29122912        /*Initialize Element matrix*/
     
    29642964        /*Intermediaries*/
    29652965        int        i,j,ig;
    29662966        int        analysis_type;
    2967         double     MAXSLOPE  = .06; // 6 %
    2968         double     MOUNTAINKEXPONENT = 10;
    2969         double     slope_magnitude,alpha2;
    2970         double     Jdet;
    2971         double     L[2][numdof];
    2972         double     DL[2][2]  = {{ 0,0 },{0,0}};
    2973         double     DL_scalar;
    2974         double     slope[2]  = {0.0,0.0};
    2975         double     xyz_list[NUMVERTICES][3];
     2967        IssmDouble     MAXSLOPE  = .06; // 6 %
     2968        IssmDouble     MOUNTAINKEXPONENT = 10;
     2969        IssmDouble     slope_magnitude,alpha2;
     2970        IssmDouble     Jdet;
     2971        IssmDouble     L[2][numdof];
     2972        IssmDouble     DL[2][2]  = {{ 0,0 },{0,0}};
     2973        IssmDouble     DL_scalar;
     2974        IssmDouble     slope[2]  = {0.0,0.0};
     2975        IssmDouble     xyz_list[NUMVERTICES][3];
    29762976        Friction  *friction = NULL;
    29772977        GaussTria *gauss    = NULL;
    29782978
     
    30013001                //velocity should be = 0. To achieve this result, we set alpha2_list to a very high value: */
    30023002                surface_input->GetInputDerivativeValue(&slope[0],&xyz_list[0][0],gauss);
    30033003                slope_magnitude=sqrt(pow(slope[0],2)+pow(slope[1],2));
    3004                 if(slope_magnitude>MAXSLOPE) alpha2=pow((double)10,MOUNTAINKEXPONENT);
     3004                if(slope_magnitude>MAXSLOPE) alpha2=pow((IssmDouble)10,MOUNTAINKEXPONENT);
    30053005                else friction->GetAlpha2(&alpha2, gauss,VxEnum,VyEnum,VzEnum);
    30063006
    30073007                GetL(&L[0][0], &xyz_list[0][0], gauss,NDOF2);
     
    30373037        /*Create Element matrix*/
    30383038        for(i=0;i<NUMVERTICES;i++){
    30393039                connectivity=nodes[i]->GetConnectivity();
    3040                 Ke->values[(2*i)*numdof  +(2*i)  ]=1/(double)connectivity;
    3041                 Ke->values[(2*i+1)*numdof+(2*i+1)]=1/(double)connectivity;
     3040                Ke->values[(2*i)*numdof  +(2*i)  ]=1/(IssmDouble)connectivity;
     3041                Ke->values[(2*i+1)*numdof+(2*i+1)]=1/(IssmDouble)connectivity;
    30423042        }
    30433043
    30443044        /*Clean up and return*/
     
    30533053
    30543054        /*Intermediaries */
    30553055        int            i,j,ig;
    3056         double         driving_stress_baseline,thickness;
    3057         double         Jdet;
    3058         double         xyz_list[NUMVERTICES][3];
    3059         double         slope[2];
    3060         double         basis[3];
    3061         double         pe_g_gaussian[numdof];
     3056        IssmDouble         driving_stress_baseline,thickness;
     3057        IssmDouble         Jdet;
     3058        IssmDouble         xyz_list[NUMVERTICES][3];
     3059        IssmDouble         slope[2];
     3060        IssmDouble         basis[3];
     3061        IssmDouble         pe_g_gaussian[numdof];
    30623062        GaussTria*     gauss=NULL;
    30633063
    30643064        /*Initialize Element vector*/
     
    31043104
    31053105        /*Intermediaries */
    31063106        int        i,connectivity;
    3107         double     constant_part,ub,vb;
    3108         double     rho_ice,gravity,n,B;
    3109         double     slope2,thickness;
    3110         double     slope[2];
     3107        IssmDouble     constant_part,ub,vb;
     3108        IssmDouble     rho_ice,gravity,n,B;
     3109        IssmDouble     slope2,thickness;
     3110        IssmDouble     slope[2];
    31113111        GaussTria* gauss=NULL;
    31123112
    31133113        /*Initialize Element vector*/
     
    31373137
    31383138                constant_part=-2*pow(rho_ice*gravity,n)*pow(slope2,((n-1)/2));
    31393139
    3140                 ub=-1.58*pow((double)10.0,(double)-10.0)*rho_ice*gravity*thickness*slope[0];
    3141                 vb=-1.58*pow((double)10.0,(double)-10.0)*rho_ice*gravity*thickness*slope[1];
     3140                ub=-1.58*pow((IssmDouble)10.0,(IssmDouble)-10.0)*rho_ice*gravity*thickness*slope[0];
     3141                vb=-1.58*pow((IssmDouble)10.0,(IssmDouble)-10.0)*rho_ice*gravity*thickness*slope[1];
    31423142
    3143                 pe->values[2*i]  =(ub-2.0*pow(rho_ice*gravity,n)*pow(slope2,((n-1)/2.0))*pow(thickness,n)/(pow(B,n)*(n+1))*slope[0])/(double)connectivity;
    3144                 pe->values[2*i+1]=(vb-2.0*pow(rho_ice*gravity,n)*pow(slope2,((n-1)/2.0))*pow(thickness,n)/(pow(B,n)*(n+1))*slope[1])/(double)connectivity;
     3143                pe->values[2*i]  =(ub-2.0*pow(rho_ice*gravity,n)*pow(slope2,((n-1)/2.0))*pow(thickness,n)/(pow(B,n)*(n+1))*slope[0])/(IssmDouble)connectivity;
     3144                pe->values[2*i+1]=(vb-2.0*pow(rho_ice*gravity,n)*pow(slope2,((n-1)/2.0))*pow(thickness,n)/(pow(B,n)*(n+1))*slope[1])/(IssmDouble)connectivity;
    31453145        }
    31463146
    31473147        /*Clean up and return*/
     
    31573157
    31583158        /*Intermediaries */
    31593159        int        i,j,ig;
    3160         double     xyz_list[NUMVERTICES][3];
    3161         double     Jdet,thickness;
    3162         double     eps1dotdphii,eps1dotdphij;
    3163         double     eps2dotdphii,eps2dotdphij;
    3164         double     mu_prime;
    3165         double     epsilon[3];/* epsilon=[exx,eyy,exy];*/
    3166         double     eps1[2],eps2[2];
    3167         double     phi[NUMVERTICES];
    3168         double     dphi[2][NUMVERTICES];
     3160        IssmDouble     xyz_list[NUMVERTICES][3];
     3161        IssmDouble     Jdet,thickness;
     3162        IssmDouble     eps1dotdphii,eps1dotdphij;
     3163        IssmDouble     eps2dotdphii,eps2dotdphij;
     3164        IssmDouble     mu_prime;
     3165        IssmDouble     epsilon[3];/* epsilon=[exx,eyy,exy];*/
     3166        IssmDouble     eps1[2],eps2[2];
     3167        IssmDouble     phi[NUMVERTICES];
     3168        IssmDouble     dphi[2][NUMVERTICES];
    31693169        GaussTria *gauss=NULL;
    31703170
    31713171        /*Initialize Jacobian with regular MacAyeal (first part of the Gateau derivative)*/
     
    32223222
    32233223        int          i;
    32243224        int*         doflist=NULL;
    3225         double       vx,vy;
    3226         double       values[numdof];
     3225        IssmDouble       vx,vy;
     3226        IssmDouble       values[numdof];
    32273227        GaussTria*   gauss=NULL;
    32283228
    32293229        /*Get dof list: */
     
    32603260        const int    numdof=NDOF2*NUMVERTICES;
    32613261
    32623262        int        i;
    3263         double     vx,vy;
    3264         double     values[numdof];
     3263        IssmDouble     vx,vy;
     3264        IssmDouble     values[numdof];
    32653265        int       *doflist = NULL;
    32663266        GaussTria *gauss   = NULL;
    32673267
     
    32943294}
    32953295/*}}}*/
    32963296/*FUNCTION Tria::InputUpdateFromSolutionDiagnosticHoriz {{{*/
    3297 void  Tria::InputUpdateFromSolutionDiagnosticHoriz(double* solution){
     3297void  Tria::InputUpdateFromSolutionDiagnosticHoriz(IssmDouble* solution){
    32983298       
    32993299        const int numdof=NDOF2*NUMVERTICES;
    33003300
    33013301        int       i;
    33023302        int*      doflist=NULL;
    3303         double    rho_ice,g;
    3304         double    values[numdof];
    3305         double    vx[NUMVERTICES];
    3306         double    vy[NUMVERTICES];
    3307         double    vz[NUMVERTICES];
    3308         double    vel[NUMVERTICES];
    3309         double    pressure[NUMVERTICES];
    3310         double    thickness[NUMVERTICES];
     3303        IssmDouble    rho_ice,g;
     3304        IssmDouble    values[numdof];
     3305        IssmDouble    vx[NUMVERTICES];
     3306        IssmDouble    vy[NUMVERTICES];
     3307        IssmDouble    vz[NUMVERTICES];
     3308        IssmDouble    vel[NUMVERTICES];
     3309        IssmDouble    pressure[NUMVERTICES];
     3310        IssmDouble    thickness[NUMVERTICES];
    33113311       
    33123312        /*Get dof list: */
    33133313        GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     
    33573357}
    33583358/*}}}*/
    33593359/*FUNCTION Tria::InputUpdateFromSolutionDiagnosticHutter {{{*/
    3360 void  Tria::InputUpdateFromSolutionDiagnosticHutter(double* solution){
     3360void  Tria::InputUpdateFromSolutionDiagnosticHutter(IssmDouble* solution){
    33613361       
    33623362        const int numdof=NDOF2*NUMVERTICES;
    33633363       
    33643364        int       i;
    33653365        int*      doflist=NULL;
    3366         double    rho_ice,g;
    3367         double    values[numdof];
    3368         double    vx[NUMVERTICES];
    3369         double    vy[NUMVERTICES];
    3370         double    vz[NUMVERTICES];
    3371         double    vel[NUMVERTICES];
    3372         double    pressure[NUMVERTICES];
    3373         double    thickness[NUMVERTICES];
     3366        IssmDouble    rho_ice,g;
     3367        IssmDouble    values[numdof];
     3368        IssmDouble    vx[NUMVERTICES];
     3369        IssmDouble    vy[NUMVERTICES];
     3370        IssmDouble    vz[NUMVERTICES];
     3371        IssmDouble    vel[NUMVERTICES];
     3372        IssmDouble    pressure[NUMVERTICES];
     3373        IssmDouble    thickness[NUMVERTICES];
    33743374       
    33753375        /*Get dof list: */
    33763376        GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     
    34193419
    34203420#ifdef _HAVE_CONTROL_
    34213421/*FUNCTION Tria::InputControlUpdate{{{*/
    3422 void  Tria::InputControlUpdate(double scalar,bool save_parameter){
     3422void  Tria::InputControlUpdate(IssmDouble scalar,bool save_parameter){
    34233423
    34243424        /*Intermediary*/
    34253425        int    num_controls;
     
    34733473
    34743474}/*}}}*/
    34753475/*FUNCTION Tria::ControlInputScaleGradient{{{*/
    3476 void Tria::ControlInputScaleGradient(int enum_type,double scale){
     3476void Tria::ControlInputScaleGradient(int enum_type,IssmDouble scale){
    34773477
    34783478        Input* input=NULL;
    34793479
     
    34893489        ((ControlInput*)input)->ScaleGradient(scale);
    34903490}/*}}}*/
    34913491/*FUNCTION Tria::ControlInputSetGradient{{{*/
    3492 void Tria::ControlInputSetGradient(double* gradient,int enum_type,int control_index){
     3492void Tria::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){
    34933493
    34943494        int    doflist1[NUMVERTICES];
    3495         double grad_list[NUMVERTICES];
     3495        IssmDouble grad_list[NUMVERTICES];
    34963496        Input* grad_input=NULL;
    34973497        Input* input=NULL;
    34983498
     
    35763576
    35773577        int        i,ig;
    35783578        int        doflist1[NUMVERTICES];
    3579         double     Jdet,weight;
    3580         double     xyz_list[NUMVERTICES][3];
    3581         double     dbasis[NDOF2][NUMVERTICES];
    3582         double     dk[NDOF2];
    3583         double     grade_g[NUMVERTICES]={0.0};
     3579        IssmDouble     Jdet,weight;
     3580        IssmDouble     xyz_list[NUMVERTICES][3];
     3581        IssmDouble     dbasis[NDOF2][NUMVERTICES];
     3582        IssmDouble     dk[NDOF2];
     3583        IssmDouble     grade_g[NUMVERTICES]={0.0};
    35843584        GaussTria  *gauss=NULL;
    35853585
    35863586        /*Retrieve all inputs we will be needing: */
     
    36173617        /*Intermediaries*/
    36183618        int        i,ig;
    36193619        int        doflist[NUMVERTICES];
    3620         double     vx,vy,lambda,mu,thickness,Jdet;
    3621         double     viscosity_complement;
    3622         double     dvx[NDOF2],dvy[NDOF2],dadjx[NDOF2],dadjy[NDOF2],dB[NDOF2];
    3623         double     xyz_list[NUMVERTICES][3];
    3624         double     basis[3],epsilon[3];
    3625         double     grad[NUMVERTICES]={0.0};
     3620        IssmDouble     vx,vy,lambda,mu,thickness,Jdet;
     3621        IssmDouble     viscosity_complement;
     3622        IssmDouble     dvx[NDOF2],dvy[NDOF2],dadjx[NDOF2],dadjy[NDOF2],dB[NDOF2];
     3623        IssmDouble     xyz_list[NUMVERTICES][3];
     3624        IssmDouble     basis[3],epsilon[3];
     3625        IssmDouble     grad[NUMVERTICES]={0.0};
    36263626        GaussTria *gauss = NULL;
    36273627
    36283628        /* Get node coordinates and dof list: */
     
    36753675        int        analysis_type;
    36763676        int        doflist1[NUMVERTICES];
    36773677        int        connectivity[NUMVERTICES];
    3678         double     vx,vy,lambda,mu,alpha_complement,Jdet;
    3679         double     bed,thickness,Neff,drag;
    3680         double     xyz_list[NUMVERTICES][3];
    3681         double     dk[NDOF2];
    3682         double     grade_g[NUMVERTICES]={0.0};
    3683         double     grade_g_gaussian[NUMVERTICES];
    3684         double     basis[3];
    3685         double     epsilon[3]; /* epsilon=[exx,eyy,exy];*/
     3678        IssmDouble     vx,vy,lambda,mu,alpha_complement,Jdet;
     3679        IssmDouble     bed,thickness,Neff,drag;
     3680        IssmDouble     xyz_list[NUMVERTICES][3];
     3681        IssmDouble     dk[NDOF2];
     3682        IssmDouble     grade_g[NUMVERTICES]={0.0};
     3683        IssmDouble     grade_g_gaussian[NUMVERTICES];
     3684        IssmDouble     basis[3];
     3685        IssmDouble     epsilon[3]; /* epsilon=[exx,eyy,exy];*/
    36863686        Friction*  friction=NULL;
    36873687        GaussTria  *gauss=NULL;
    36883688
     
    37453745        //      adjointy_input->GetInputValue(&mu, gauss);
    37463746        //      vx_input->GetInputValue(&vx,gauss);
    37473747        //      vy_input->GetInputValue(&vy,gauss);
    3748         //      grade_g[iv] = -2*1.e+7*drag*alpha_complement*(lambda*vx+mu*vy)/((double)connectivity[iv]);
     3748        //      grade_g[iv] = -2*1.e+7*drag*alpha_complement*(lambda*vx+mu*vy)/((IssmDouble)connectivity[iv]);
    37493749        //}
    37503750        /*End Analytical gradient*/
    37513751
     
    37613761
    37623762        int        i,ig;
    37633763        int        doflist1[NUMVERTICES];
    3764         double     Jdet,weight;
    3765         double     xyz_list[NUMVERTICES][3];
    3766         double     dbasis[NDOF2][NUMVERTICES];
    3767         double     dk[NDOF2];
    3768         double     grade_g[NUMVERTICES]={0.0};
     3764        IssmDouble     Jdet,weight;
     3765        IssmDouble     xyz_list[NUMVERTICES][3];
     3766        IssmDouble     dbasis[NDOF2][NUMVERTICES];
     3767        IssmDouble     dk[NDOF2];
     3768        IssmDouble     grade_g[NUMVERTICES]={0.0};
    37693769        GaussTria  *gauss=NULL;
    37703770
    37713771        /*Retrieve all inputs we will be needing: */
     
    38053805
    38063806        /*Intermediaries*/
    38073807        int    doflist1[NUMVERTICES];
    3808         double lambda[NUMVERTICES];
    3809         double gradient_g[NUMVERTICES];
     3808        IssmDouble lambda[NUMVERTICES];
     3809        IssmDouble gradient_g[NUMVERTICES];
    38103810
    38113811        /*Compute Gradient*/
    38123812        GradientIndexing(&doflist1[0],control_index);
     
    38223822        /*Intermediaries*/
    38233823        int        i,ig;
    38243824        int        doflist1[NUMVERTICES];
    3825         double     thickness,Jdet;
    3826         double     basis[3];
    3827         double     Dlambda[2],dp[2];
    3828         double     xyz_list[NUMVERTICES][3];
    3829         double     grade_g[NUMVERTICES] = {0.0};
     3825        IssmDouble     thickness,Jdet;
     3826        IssmDouble     basis[3];
     3827        IssmDouble     Dlambda[2],dp[2];
     3828        IssmDouble     xyz_list[NUMVERTICES][3];
     3829        IssmDouble     grade_g[NUMVERTICES] = {0.0};
    38303830        GaussTria *gauss                = NULL;
    38313831
    38323832        /* Get node coordinates and dof list: */
     
    38653865        /*Intermediaries*/
    38663866        int        i,ig;
    38673867        int        doflist1[NUMVERTICES];
    3868         double     thickness,Jdet;
    3869         double     basis[3];
    3870         double     Dlambda[2],dp[2];
    3871         double     xyz_list[NUMVERTICES][3];
    3872         double     grade_g[NUMVERTICES] = {0.0};
     3868        IssmDouble     thickness,Jdet;
     3869        IssmDouble     basis[3];
     3870        IssmDouble     Dlambda[2],dp[2];
     3871        IssmDouble     xyz_list[NUMVERTICES][3];
     3872        IssmDouble     grade_g[NUMVERTICES] = {0.0};
    38733873        GaussTria *gauss                = NULL;
    38743874
    38753875        /* Get node coordinates and dof list: */
     
    39163916}
    39173917/*}}}*/
    39183918/*FUNCTION Tria::RheologyBbarAbsGradient{{{*/
    3919 double Tria::RheologyBbarAbsGradient(bool process_units,int weight_index){
     3919IssmDouble Tria::RheologyBbarAbsGradient(bool process_units,int weight_index){
    39203920
    39213921        /* Intermediaries */
    39223922        int        ig;
    3923         double     Jelem = 0;
    3924         double     weight;
    3925         double     Jdet;
    3926         double     xyz_list[NUMVERTICES][3];
    3927         double     dp[NDOF2];
     3923        IssmDouble     Jelem = 0;
     3924        IssmDouble     weight;
     3925        IssmDouble     Jdet;
     3926        IssmDouble     xyz_list[NUMVERTICES][3];
     3927        IssmDouble     dp[NDOF2];
    39283928        GaussTria *gauss = NULL;
    39293929
    39303930        /*retrieve parameters and inputs*/
     
    39603960}
    39613961/*}}}*/
    39623962/*FUNCTION Tria::SurfaceAverageVelMisfit {{{*/
    3963 double Tria::SurfaceAverageVelMisfit(bool process_units,int weight_index){
     3963IssmDouble Tria::SurfaceAverageVelMisfit(bool process_units,int weight_index){
    39643964
    39653965        const int    numdof=2*NUMVERTICES;
    39663966
    39673967        int        i,ig;
    3968         double     Jelem=0,S,Jdet;
    3969         double     misfit;
    3970         double     vx,vy,vxobs,vyobs,weight;
    3971         double     xyz_list[NUMVERTICES][3];
     3968        IssmDouble     Jelem=0,S,Jdet;
     3969        IssmDouble     misfit;
     3970        IssmDouble     vx,vy,vxobs,vyobs,weight;
     3971        IssmDouble     xyz_list[NUMVERTICES][3];
    39723972        GaussTria *gauss=NULL;
    39733973
    39743974        /*If on water, return 0: */
     
    40214021}
    40224022/*}}}*/
    40234023/*FUNCTION Tria::SurfaceLogVelMisfit {{{*/
    4024 double Tria::SurfaceLogVelMisfit(bool process_units,int weight_index){
     4024IssmDouble Tria::SurfaceLogVelMisfit(bool process_units,int weight_index){
    40254025
    40264026        const int    numdof=NDOF2*NUMVERTICES;
    40274027
    40284028        int        i,ig;
    4029         double     Jelem=0;
    4030         double     misfit,Jdet;
    4031         double     epsvel=2.220446049250313e-16;
    4032         double     meanvel=3.170979198376458e-05; /*1000 m/yr*/
    4033         double     velocity_mag,obs_velocity_mag;
    4034         double     xyz_list[NUMVERTICES][3];
    4035         double     vx,vy,vxobs,vyobs,weight;
     4029        IssmDouble     Jelem=0;
     4030        IssmDouble     misfit,Jdet;
     4031        IssmDouble     epsvel=2.220446049250313e-16;
     4032        IssmDouble     meanvel=3.170979198376458e-05; /*1000 m/yr*/
     4033        IssmDouble     velocity_mag,obs_velocity_mag;
     4034        IssmDouble     xyz_list[NUMVERTICES][3];
     4035        IssmDouble     vx,vy,vxobs,vyobs,weight;
    40364036        GaussTria *gauss=NULL;
    40374037
    40384038        /*If on water, return 0: */
     
    40864086}
    40874087/*}}}*/
    40884088/*FUNCTION Tria::SurfaceLogVxVyMisfit {{{*/
    4089 double Tria::SurfaceLogVxVyMisfit(bool process_units,int weight_index){
     4089IssmDouble Tria::SurfaceLogVxVyMisfit(bool process_units,int weight_index){
    40904090
    40914091        const int    numdof=NDOF2*NUMVERTICES;
    40924092
    40934093        int        i,ig;
    40944094        int        fit=-1;
    4095         double     Jelem=0, S=0;
    4096         double     epsvel=2.220446049250313e-16;
    4097         double     meanvel=3.170979198376458e-05; /*1000 m/yr*/
    4098         double     misfit, Jdet;
    4099         double     vx,vy,vxobs,vyobs,weight;
    4100         double     xyz_list[NUMVERTICES][3];
     4095        IssmDouble     Jelem=0, S=0;
     4096        IssmDouble     epsvel=2.220446049250313e-16;
     4097        IssmDouble     meanvel=3.170979198376458e-05; /*1000 m/yr*/
     4098        IssmDouble     misfit, Jdet;
     4099        IssmDouble     vx,vy,vxobs,vyobs,weight;
     4100        IssmDouble     xyz_list[NUMVERTICES][3];
    41014101        GaussTria *gauss=NULL;
    41024102
    41034103        /*If on water, return 0: */
     
    41524152}
    41534153/*}}}*/
    41544154/*FUNCTION Tria::SurfaceAbsVelMisfit {{{*/
    4155 double Tria::SurfaceAbsVelMisfit(bool process_units,int weight_index){
     4155IssmDouble Tria::SurfaceAbsVelMisfit(bool process_units,int weight_index){
    41564156
    41574157        const int    numdof=NDOF2*NUMVERTICES;
    41584158
    41594159        int        i,ig;
    4160         double     Jelem=0;
    4161         double     misfit,Jdet;
    4162         double     vx,vy,vxobs,vyobs,weight;
    4163         double     xyz_list[NUMVERTICES][3];
     4160        IssmDouble     Jelem=0;
     4161        IssmDouble     misfit,Jdet;
     4162        IssmDouble     vx,vy,vxobs,vyobs,weight;
     4163        IssmDouble     xyz_list[NUMVERTICES][3];
    41644164        GaussTria *gauss=NULL;
    41654165
    41664166        /*If on water, return 0: */
     
    42134213}
    42144214/*}}}*/
    42154215/*FUNCTION Tria::SurfaceRelVelMisfit {{{*/
    4216 double Tria::SurfaceRelVelMisfit(bool process_units,int weight_index){
     4216IssmDouble Tria::SurfaceRelVelMisfit(bool process_units,int weight_index){
    42174217        const int  numdof=2*NUMVERTICES;
    42184218
    42194219        int        i,ig;
    4220         double     Jelem=0;
    4221         double     scalex=1,scaley=1;
    4222         double     misfit,Jdet;
    4223         double     epsvel=2.220446049250313e-16;
    4224         double     meanvel=3.170979198376458e-05; /*1000 m/yr*/
    4225         double     vx,vy,vxobs,vyobs,weight;
    4226         double     xyz_list[NUMVERTICES][3];
     4220        IssmDouble     Jelem=0;
     4221        IssmDouble     scalex=1,scaley=1;
     4222        IssmDouble     misfit,Jdet;
     4223        IssmDouble     epsvel=2.220446049250313e-16;
     4224        IssmDouble     meanvel=3.170979198376458e-05; /*1000 m/yr*/
     4225        IssmDouble     vx,vy,vxobs,vyobs,weight;
     4226        IssmDouble     xyz_list[NUMVERTICES][3];
    42274227        GaussTria *gauss=NULL;
    42284228
    42294229        /*If on water, return 0: */
     
    42774277}
    42784278/*}}}*/
    42794279/*FUNCTION Tria::ThicknessAbsGradient{{{*/
    4280 double Tria::ThicknessAbsGradient(bool process_units,int weight_index){
     4280IssmDouble Tria::ThicknessAbsGradient(bool process_units,int weight_index){
    42814281
    42824282        /* Intermediaries */
    42834283        int        ig;
    4284         double     Jelem = 0;
    4285         double     weight;
    4286         double     Jdet;
    4287         double     xyz_list[NUMVERTICES][3];
    4288         double     dp[NDOF2];
     4284        IssmDouble     Jelem = 0;
     4285        IssmDouble     weight;
     4286        IssmDouble     Jdet;
     4287        IssmDouble     xyz_list[NUMVERTICES][3];
     4288        IssmDouble     dp[NDOF2];
    42894289        GaussTria *gauss = NULL;
    42904290
    42914291        /*retrieve parameters and inputs*/
     
    43214321}
    43224322/*}}}*/
    43234323/*FUNCTION Tria::ThicknessAbsMisfit {{{*/
    4324 double Tria::ThicknessAbsMisfit(bool process_units,int weight_index){
     4324IssmDouble Tria::ThicknessAbsMisfit(bool process_units,int weight_index){
    43254325
    43264326        /*Intermediaries*/
    43274327        int        i,ig;
    4328         double     thickness,thicknessobs,weight;
    4329         double     Jdet;
    4330         double     Jelem = 0;
    4331         double     xyz_list[NUMVERTICES][3];
     4328        IssmDouble     thickness,thicknessobs,weight;
     4329        IssmDouble     Jdet;
     4330        IssmDouble     Jelem = 0;
     4331        IssmDouble     xyz_list[NUMVERTICES][3];
    43324332        GaussTria *gauss = NULL;
    4333         double     dH[2];
     4333        IssmDouble     dH[2];
    43344334
    43354335        /*If on water, return 0: */
    43364336        if(IsOnWater())return 0;
     
    43734373
    43744374        /*Intermediaries */
    43754375        int         i,ig,resp;
    4376         double      Jdet;
    4377         double      thickness,thicknessobs,weight;
     4376        IssmDouble      Jdet;
     4377        IssmDouble      thickness,thicknessobs,weight;
    43784378        int        *responses = NULL;
    43794379        int         num_responses;
    4380         double      xyz_list[NUMVERTICES][3];
    4381         double      basis[3];
    4382         double      dbasis[NDOF2][NUMVERTICES];
    4383         double      dH[2];
     4380        IssmDouble      xyz_list[NUMVERTICES][3];
     4381        IssmDouble      basis[3];
     4382        IssmDouble      dbasis[NDOF2][NUMVERTICES];
     4383        IssmDouble      dH[2];
    43844384        GaussTria*  gauss=NULL;
    43854385
    43864386        /*Initialize Element vector*/
     
    44414441        int        i,resp,ig;
    44424442        int       *responses=NULL;
    44434443        int        num_responses;
    4444         double     Jdet;
    4445         double     obs_velocity_mag,velocity_mag;
    4446         double     dux,duy;
    4447         double     epsvel=2.220446049250313e-16;
    4448         double     meanvel=3.170979198376458e-05; /*1000 m/yr*/
    4449         double     scalex=0,scaley=0,scale=0,S=0;
    4450         double     vx,vy,vxobs,vyobs,weight;
    4451         double     xyz_list[NUMVERTICES][3];
    4452         double     basis[3];
     4444        IssmDouble     Jdet;
     4445        IssmDouble     obs_velocity_mag,velocity_mag;
     4446        IssmDouble     dux,duy;
     4447        IssmDouble     epsvel=2.220446049250313e-16;
     4448        IssmDouble     meanvel=3.170979198376458e-05; /*1000 m/yr*/
     4449        IssmDouble     scalex=0,scaley=0,scale=0,S=0;
     4450        IssmDouble     vx,vy,vxobs,vyobs,weight;
     4451        IssmDouble     xyz_list[NUMVERTICES][3];
     4452        IssmDouble     basis[3];
    44534453        GaussTria* gauss=NULL;
    44544454
    44554455        /*Initialize Element vector*/
     
    46174617        int        i,resp,ig;
    46184618        int       *responses=NULL;
    46194619        int        num_responses;
    4620         double     Jdet;
    4621         double     obs_velocity_mag,velocity_mag;
    4622         double     dux,duy;
    4623         double     epsvel=2.220446049250313e-16;
    4624         double     meanvel=3.170979198376458e-05; /*1000 m/yr*/
    4625         double     scalex=0,scaley=0,scale=0,S=0;
    4626         double     vx,vy,vxobs,vyobs,weight;
    4627         double     xyz_list[NUMVERTICES][3];
    4628         double     basis[3];
     4620        IssmDouble     Jdet;
     4621        IssmDouble     obs_velocity_mag,velocity_mag;
     4622        IssmDouble     dux,duy;
     4623        IssmDouble     epsvel=2.220446049250313e-16;
     4624        IssmDouble     meanvel=3.170979198376458e-05; /*1000 m/yr*/
     4625        IssmDouble     scalex=0,scaley=0,scale=0,S=0;
     4626        IssmDouble     vx,vy,vxobs,vyobs,weight;
     4627        IssmDouble     xyz_list[NUMVERTICES][3];
     4628        IssmDouble     basis[3];
    46294629        GaussTria* gauss=NULL;
    46304630
    46314631        /*Initialize Element vector*/
     
    47884788}
    47894789/*}}}*/
    47904790/*FUNCTION Tria::DragCoefficientAbsGradient{{{*/
    4791 double Tria::DragCoefficientAbsGradient(bool process_units,int weight_index){
     4791IssmDouble Tria::DragCoefficientAbsGradient(bool process_units,int weight_index){
    47924792
    47934793        /* Intermediaries */
    47944794        int        ig;
    4795         double     Jelem = 0;
    4796         double     weight;
    4797         double     Jdet;
    4798         double     xyz_list[NUMVERTICES][3];
    4799         double     dp[NDOF2];
     4795        IssmDouble     Jelem = 0;
     4796        IssmDouble     weight;
     4797        IssmDouble     Jdet;
     4798        IssmDouble     xyz_list[NUMVERTICES][3];
     4799        IssmDouble     dp[NDOF2];
    48004800        GaussTria *gauss = NULL;
    48014801
    48024802        /*retrieve parameters and inputs*/
     
    48624862        /*Intermediaries */
    48634863        int        i,j,ig;
    48644864        bool       incomplete_adjoint;
    4865         double     xyz_list[NUMVERTICES][3];
    4866         double     Jdet,thickness;
    4867         double     eps1dotdphii,eps1dotdphij;
    4868         double     eps2dotdphii,eps2dotdphij;
    4869         double     mu_prime;
    4870         double     epsilon[3];/* epsilon=[exx,eyy,exy];*/
    4871         double     eps1[2],eps2[2];
    4872         double     phi[NUMVERTICES];
    4873         double     dphi[2][NUMVERTICES];
     4865        IssmDouble     xyz_list[NUMVERTICES][3];
     4866        IssmDouble     Jdet,thickness;
     4867        IssmDouble     eps1dotdphii,eps1dotdphij;
     4868        IssmDouble     eps2dotdphii,eps2dotdphij;
     4869        IssmDouble     mu_prime;
     4870        IssmDouble     epsilon[3];/* epsilon=[exx,eyy,exy];*/
     4871        IssmDouble     eps1[2],eps2[2];
     4872        IssmDouble     phi[NUMVERTICES];
     4873        IssmDouble     dphi[2][NUMVERTICES];
    48744874        GaussTria *gauss=NULL;
    48754875
    48764876        /*Initialize Jacobian with regular MacAyeal (first part of the Gateau derivative)*/
     
    49244924}
    49254925/*}}}*/
    49264926/*FUNCTION Tria::InputUpdateFromSolutionAdjointHoriz {{{*/
    4927 void  Tria::InputUpdateFromSolutionAdjointHoriz(double* solution){
     4927void  Tria::InputUpdateFromSolutionAdjointHoriz(IssmDouble* solution){
    49284928
    49294929        const int numdof=NDOF2*NUMVERTICES;
    49304930
    49314931        int       i;
    49324932        int*      doflist=NULL;
    4933         double    values[numdof];
    4934         double    lambdax[NUMVERTICES];
    4935         double    lambday[NUMVERTICES];
     4933        IssmDouble    values[numdof];
     4934        IssmDouble    lambdax[NUMVERTICES];
     4935        IssmDouble    lambday[NUMVERTICES];
    49364936
    49374937        /*Get dof list: */
    49384938        GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     
    49594959}
    49604960/*}}}*/
    49614961/*FUNCTION Tria::InputUpdateFromSolutionAdjointBalancethickness {{{*/
    4962 void  Tria::InputUpdateFromSolutionAdjointBalancethickness(double* solution){
     4962void  Tria::InputUpdateFromSolutionAdjointBalancethickness(IssmDouble* solution){
    49634963
    49644964        const int numdof=NDOF1*NUMVERTICES;
    49654965
    49664966        int       i;
    49674967        int*      doflist=NULL;
    4968         double    values[numdof];
    4969         double    lambda[NUMVERTICES];
     4968        IssmDouble    values[numdof];
     4969        IssmDouble    lambda[NUMVERTICES];
    49704970
    49714971        /*Get dof list: */
    49724972        GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     
    50165016}
    50175017/*}}}*/
    50185018/*FUNCTION Tria::SetControlInputsFromVector{{{*/
    5019 void  Tria::SetControlInputsFromVector(double* vector,int control_enum,int control_index){
     5019void  Tria::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){
    50205020
    5021         double  values[NUMVERTICES];
     5021        IssmDouble  values[NUMVERTICES];
    50225022        int     doflist1[NUMVERTICES];
    50235023        Input  *input     = NULL;
    50245024        Input  *new_input = NULL;
     
    50565056void Tria::CreateHydrologyWaterVelocityInput(void){
    50575057
    50585058        /*material parameters: */
    5059         double mu_water;
    5060         double VelocityFactor;  // This factor represents the number 12 in laminar flow velocity which can vary by differnt hydrology.CR
    5061         double n_man,CR;
    5062         double w;
    5063         double rho_ice, rho_water, g;
    5064         double dsdx,dsdy,dbdx,dbdy;
    5065         double vx[NUMVERTICES];
    5066         double vy[NUMVERTICES];
     5059        IssmDouble mu_water;
     5060        IssmDouble VelocityFactor;  // This factor represents the number 12 in laminar flow velocity which can vary by differnt hydrology.CR
     5061        IssmDouble n_man,CR;
     5062        IssmDouble w;
     5063        IssmDouble rho_ice, rho_water, g;
     5064        IssmDouble dsdx,dsdy,dbdx,dbdy;
     5065        IssmDouble vx[NUMVERTICES];
     5066        IssmDouble vy[NUMVERTICES];
    50675067        GaussTria *gauss = NULL;
    50685068
    50695069        /*Retrieve all inputs and parameters*/
     
    51145114        const int    numdof=NDOF1*NUMVERTICES;
    51155115
    51165116        /*Intermediaries */
    5117         double     diffusivity;
     5117        IssmDouble     diffusivity;
    51185118        int        i,j,ig;
    5119         double     Jdettria,DL_scalar,dt,h;
    5120         double     vx,vy,vel,dvxdx,dvydy;
    5121         double     dvx[2],dvy[2];
    5122         double     v_gauss[2]={0.0};
    5123         double     xyz_list[NUMVERTICES][3];
    5124         double     L[NUMVERTICES];
    5125         double     B[2][NUMVERTICES];
    5126         double     Bprime[2][NUMVERTICES];
    5127         double     K[2][2]                        ={0.0};
    5128         double     KDL[2][2]                      ={0.0};
    5129         double     DL[2][2]                        ={0.0};
    5130         double     DLprime[2][2]                   ={0.0};
     5119        IssmDouble     Jdettria,DL_scalar,dt,h;
     5120        IssmDouble     vx,vy,vel,dvxdx,dvydy;
     5121        IssmDouble     dvx[2],dvy[2];
     5122        IssmDouble     v_gauss[2]={0.0};
     5123        IssmDouble     xyz_list[NUMVERTICES][3];
     5124        IssmDouble     L[NUMVERTICES];
     5125        IssmDouble     B[2][NUMVERTICES];
     5126        IssmDouble     Bprime[2][NUMVERTICES];
     5127        IssmDouble     K[2][2]                        ={0.0};
     5128        IssmDouble     KDL[2][2]                      ={0.0};
     5129        IssmDouble     DL[2][2]                        ={0.0};
     5130        IssmDouble     DLprime[2][2]                   ={0.0};
    51315131        GaussTria *gauss=NULL;
    51325132
    51335133        /*Skip if water or ice shelf element*/
     
    52205220
    52215221        /*Intermediaries */
    52225222        int        i,j,ig;
    5223         double     Jdettria,dt;
    5224         double     basal_melting_g;
    5225         double     old_watercolumn_g;
    5226         double     xyz_list[NUMVERTICES][3];
    5227         double     basis[numdof];
     5223        IssmDouble     Jdettria,dt;
     5224        IssmDouble     basal_melting_g;
     5225        IssmDouble     old_watercolumn_g;
     5226        IssmDouble     xyz_list[NUMVERTICES][3];
     5227        IssmDouble     basis[numdof];
    52285228        GaussTria* gauss=NULL;
    52295229
    52305230        /*Skip if water or ice shelf element*/
     
    52685268
    52695269        int i;
    52705270        int*         doflist=NULL;
    5271         double       watercolumn;
    5272         double       values[numdof];
     5271        IssmDouble       watercolumn;
     5272        IssmDouble       values[numdof];
    52735273        GaussTria*   gauss=NULL;
    52745274
    52755275        /*Get dof list: */
     
    52985298}
    52995299/*}}}*/
    53005300/*FUNCTION Tria::InputUpdateFromSolutionHydrology{{{*/
    5301 void  Tria::InputUpdateFromSolutionHydrology(double* solution){
     5301void  Tria::InputUpdateFromSolutionHydrology(IssmDouble* solution){
    53025302
    53035303        /*Intermediaries*/
    53045304        const int numdof = NDOF1*NUMVERTICES;
    53055305
    53065306        int       i;
    53075307        int*      doflist=NULL;
    5308         double    values[numdof];
     5308        IssmDouble    values[numdof];
    53095309
    53105310        /*Get dof list: */
    53115311        GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     
    53145314        for(i=0;i<numdof;i++){
    53155315                values[i]=solution[doflist[i]];
    53165316                if(isnan(values[i])) _error_("NaN found in solution vector");
    5317                 if (values[i]<pow((double)10,(double)-10))values[i]=pow((double)10,(double)-10); //correcting the water column to positive values
     5317                if (values[i]<pow((IssmDouble)10,(IssmDouble)-10))values[i]=pow((IssmDouble)10,(IssmDouble)-10); //correcting the water column to positive values
    53185318 
    53195319        }
    53205320
     
    53285328#endif
    53295329
    53305330#ifdef _HAVE_DAKOTA_
    5331 /*FUNCTION Tria::InputUpdateFromVectorDakota(double* vector, int name, int type);{{{*/
    5332 void  Tria::InputUpdateFromVectorDakota(double* vector, int name, int type){
     5331/*FUNCTION Tria::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);{{{*/
     5332void  Tria::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){
    53335333       
    53345334        int i,j;
    53355335
     
    53415341                case VertexEnum:
    53425342
    53435343                        /*New TriaP1Input*/
    5344                         double values[3];
     5344                        IssmDouble values[3];
    53455345
    53465346                        /*Get values on the 3 vertices*/
    53475347                        for (i=0;i<3;i++){
     
    53525352                        switch(name){
    53535353                                case ThicknessEnum:
    53545354                                        /*Update thickness + surface: assume bed is constant. On ice shelves, takes hydrostatic equilibrium {{{*/
    5355                                         double  thickness[3];
    5356                                         double  thickness_init[3];
    5357                                         double  hydrostatic_ratio[3];
    5358                                         double  surface[3];
    5359                                         double  bed[3];
     5355                                        IssmDouble  thickness[3];
     5356                                        IssmDouble  thickness_init[3];
     5357                                        IssmDouble  hydrostatic_ratio[3];
     5358                                        IssmDouble  surface[3];
     5359                                        IssmDouble  bed[3];
    53605360                                       
    53615361                                        /*retrieve inputs: */
    53625362                                        GetInputListOnVertices(&thickness_init[0],ThicknessEnum);
     
    53705370                                        /*build new bed and surface: */
    53715371                                        if (this->IsFloating()){
    53725372                                                /*hydrostatic equilibrium: */
    5373                                                 double rho_ice,rho_water,di;
     5373                                                IssmDouble rho_ice,rho_water,di;
    53745374                                                rho_ice=this->matpar->GetRhoIce();
    53755375                                                rho_water=this->matpar->GetRhoWater();
    53765376
     
    54405440        _error_(" not supported yet!");
    54415441}
    54425442/*}}}*/
    5443 /*FUNCTION Tria::InputUpdateFromMatrixDakota(double* matrix, int nrows, int ncols, int name, int type);{{{*/
    5444 void  Tria::InputUpdateFromMatrixDakota(double* matrix, int nrows, int ncols, int name, int type){
     5443/*FUNCTION Tria::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type);{{{*/
     5444void  Tria::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){
    54455445       
    54465446        int i,j,t;
    54475447        TransientInput* transientinput=NULL;
    5448         double values[3];
    5449         double time;
     5448        IssmDouble values[3];
     5449        IssmDouble time;
    54505450        int row;
    5451         double yts;
     5451        IssmDouble yts;
    54525452
    54535453        /*Check that name is an element input*/
    54545454        if (!IsInput(name)) return;
     
    54655465                                /*create input values: */
    54665466                                for(i=0;i<3;i++){
    54675467                                        row=this->nodes[i]->GetSidList();
    5468                                         values[i]=(double)matrix[ncols*row+t];
     5468                                        values[i]=(IssmDouble)matrix[ncols*row+t];
    54695469                                }
    54705470
    54715471                                /*time? :*/
    5472                                 time=(double)matrix[(nrows-1)*ncols+t]*yts;
     5472                                time=(IssmDouble)matrix[(nrows-1)*ncols+t]*yts;
    54735473
    54745474                                if(t==0) transientinput=new TransientInput(name);
    54755475                                transientinput->AddTimeInput(new TriaP1Input(name,values),time);
     
    55105510        /*Intermediaries */
    55115511        int        stabilization;
    55125512        int        i,j,ig,dim;
    5513         double     Jdettria,vx,vy,dvxdx,dvydy,vel,h;
    5514         double     dvx[2],dvy[2];
    5515         double     xyz_list[NUMVERTICES][3];
    5516         double     L[NUMVERTICES];
    5517         double     B[2][NUMVERTICES];
    5518         double     Bprime[2][NUMVERTICES];
    5519         double     K[2][2]                          = {0.0};
    5520         double     KDL[2][2]                        = {0.0};
    5521         double     DL[2][2]                         = {0.0};
    5522         double     DLprime[2][2]                    = {0.0};
    5523         double     DL_scalar;
     5513        IssmDouble     Jdettria,vx,vy,dvxdx,dvydy,vel,h;
     5514        IssmDouble     dvx[2],dvy[2];
     5515        IssmDouble     xyz_list[NUMVERTICES][3];
     5516        IssmDouble     L[NUMVERTICES];
     5517        IssmDouble     B[2][NUMVERTICES];
     5518        IssmDouble     Bprime[2][NUMVERTICES];
     5519        IssmDouble     K[2][2]                          = {0.0};
     5520        IssmDouble     KDL[2][2]                        = {0.0};
     5521        IssmDouble     DL[2][2]                         = {0.0};
     5522        IssmDouble     DLprime[2][2]                    = {0.0};
     5523        IssmDouble     DL_scalar;
    55245524        GaussTria *gauss                            = NULL;
    55255525
    55265526        /*Initialize Element matrix*/
     
    56195619
    56205620        /*Intermediaries*/
    56215621        int        i,j,ig,dim;
    5622         double     vx,vy,Jdettria;
    5623         double     xyz_list[NUMVERTICES][3];
    5624         double     B[2][NUMVERTICES];
    5625         double     Bprime[2][NUMVERTICES];
    5626         double     DL[2][2]={0.0};
    5627         double     DL_scalar;
     5622        IssmDouble     vx,vy,Jdettria;
     5623        IssmDouble     xyz_list[NUMVERTICES][3];
     5624        IssmDouble     B[2][NUMVERTICES];
     5625        IssmDouble     Bprime[2][NUMVERTICES];
     5626        IssmDouble     DL[2][2]={0.0};
     5627        IssmDouble     DL_scalar;
    56285628        GaussTria  *gauss=NULL;
    56295629
    56305630        /*Initialize Element matrix*/
     
    56875687       
    56885688        /*Intermediaries */
    56895689        int        i,j,ig;
    5690         double     xyz_list[NUMVERTICES][3];
    5691         double     dhdt_g,basal_melting_g,surface_mass_balance_g,Jdettria;
    5692         double     L[NUMVERTICES];
     5690        IssmDouble     xyz_list[NUMVERTICES][3];
     5691        IssmDouble     dhdt_g,basal_melting_g,surface_mass_balance_g,Jdettria;
     5692        IssmDouble     L[NUMVERTICES];
    56935693        GaussTria* gauss=NULL;
    56945694
    56955695        /*Initialize Element vector*/
     
    57305730
    57315731        /*Intermediaries */
    57325732        int        i,j,ig;
    5733         double     xyz_list[NUMVERTICES][3];
    5734         double     basal_melting_g,surface_mass_balance_g,dhdt_g,Jdettria;
    5735         double     L[NUMVERTICES];
     5733        IssmDouble     xyz_list[NUMVERTICES][3];
     5734        IssmDouble     basal_melting_g,surface_mass_balance_g,dhdt_g,Jdettria;
     5735        IssmDouble     L[NUMVERTICES];
    57365736        GaussTria* gauss=NULL;
    57375737
    57385738        /*Initialize Element vector*/
  • u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/TriaRef.h

     
    2424                void SetElementType(int type,int type_counter);
    2525
    2626                /*Numerics*/
    27                 void GetBMacAyeal(double* B, double* xyz_list, GaussTria* gauss);
    28                 void GetBMacAyealStokes(double* B , double* xyz_list, GaussTria* gauss);
    29                 void GetBprimeMacAyeal(double* Bprime, double* xyz_list, GaussTria* gauss);
    30                 void GetBprimeMacAyealStokes(double* Bprime, double* xyz_list, GaussTria* gauss);
    31                 void GetBprimePrognostic(double* Bprime_prog, double* xyz_list, GaussTria* gauss);
    32                 void GetBPrognostic(double* B_prog, double* xyz_list, GaussTria* gauss);
    33                 void GetL(double* L, double* xyz_list,GaussTria* gauss,int numdof);
    34                 void GetJacobian(double* J, double* xyz_list,GaussTria* gauss);
    35                 void GetSegmentJacobianDeterminant(double* Jdet, double* xyz_list,GaussTria* gauss);
    36                 void GetJacobianDeterminant2d(double* Jdet, double* xyz_list,GaussTria* gauss);
    37                 void GetJacobianDeterminant3d(double* Jdet, double* xyz_list,GaussTria* gauss);
    38                 void GetJacobianInvert(double*  Jinv, double* xyz_list,GaussTria* gauss);
    39                 void GetNodalFunctions(double* l1l2l3,GaussTria* gauss);
    40                 void GetSegmentNodalFunctions(double* l1l2l3,GaussTria* gauss, int index1,int index2);
    41                 void GetSegmentBFlux(double* B,GaussTria* gauss, int index1,int index2);
    42                 void GetSegmentBprimeFlux(double* Bprime,GaussTria* gauss, int index1,int index2);
    43                 void GetNodalFunctionsDerivatives(double* l1l2l3,double* xyz_list, GaussTria* gauss);
    44                 void GetNodalFunctionsDerivativesReference(double* dl1dl3,GaussTria* gauss);
    45                 void GetInputValue(double* pp, double* plist, GaussTria* gauss);
    46                 void GetInputDerivativeValue(double* pp, double* plist,double* xyz_list, GaussTria* gauss);
     27                void GetBMacAyeal(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss);
     28                void GetBMacAyealStokes(IssmDouble* B , IssmDouble* xyz_list, GaussTria* gauss);
     29                void GetBprimeMacAyeal(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss);
     30                void GetBprimeMacAyealStokes(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss);
     31                void GetBprimePrognostic(IssmDouble* Bprime_prog, IssmDouble* xyz_list, GaussTria* gauss);
     32                void GetBPrognostic(IssmDouble* B_prog, IssmDouble* xyz_list, GaussTria* gauss);
     33                void GetL(IssmDouble* L, IssmDouble* xyz_list,GaussTria* gauss,int numdof);
     34                void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussTria* gauss);
     35                void GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss);
     36                void GetJacobianDeterminant2d(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss);
     37                void GetJacobianDeterminant3d(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss);
     38                void GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,GaussTria* gauss);
     39                void GetNodalFunctions(IssmDouble* l1l2l3,GaussTria* gauss);
     40                void GetSegmentNodalFunctions(IssmDouble* l1l2l3,GaussTria* gauss, int index1,int index2);
     41                void GetSegmentBFlux(IssmDouble* B,GaussTria* gauss, int index1,int index2);
     42                void GetSegmentBprimeFlux(IssmDouble* Bprime,GaussTria* gauss, int index1,int index2);
     43                void GetNodalFunctionsDerivatives(IssmDouble* l1l2l3,IssmDouble* xyz_list, GaussTria* gauss);
     44                void GetNodalFunctionsDerivativesReference(IssmDouble* dl1dl3,GaussTria* gauss);
     45                void GetInputValue(IssmDouble* pp, IssmDouble* plist, GaussTria* gauss);
     46                void GetInputDerivativeValue(IssmDouble* pp, IssmDouble* plist,IssmDouble* xyz_list, GaussTria* gauss);
    4747
    4848};
    4949#endif
  • u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/PentaRef.cpp

     
    5757
    5858/*Reference Element numerics*/
    5959/*FUNCTION PentaRef::GetBMacAyealPattyn {{{*/
    60 void PentaRef::GetBMacAyealPattyn(double* B, double* xyz_list, GaussPenta* gauss){
     60void PentaRef::GetBMacAyealPattyn(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
    6161        /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2.
    6262         * For node i, Bi can be expressed in the actual coordinate system
    6363         * by:
     
    6969         * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
    7070         */
    7171
    72         double dbasis[3][NUMNODESP1];
     72        IssmDouble dbasis[3][NUMNODESP1];
    7373
    7474        /*Get dbasis in actual coordinate system: */
    7575        GetNodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss);
     
    8888}
    8989/*}}}*/
    9090/*FUNCTION PentaRef::GetBMacAyealStokes{{{*/
    91 void PentaRef::GetBMacAyealStokes(double* B, double* xyz_list, GaussPenta* gauss){
     91void PentaRef::GetBMacAyealStokes(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
    9292        /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2.
    9393         * For node i, Bi can be expressed in the actual coordinate system
    9494         * by:
     
    102102         */
    103103
    104104        int    i;
    105         double dh1dh7[3][NUMNODESMINI];
    106         double l1l6[NUMNODESP1];
     105        IssmDouble dh1dh7[3][NUMNODESMINI];
     106        IssmDouble l1l6[NUMNODESP1];
    107107
    108108        /*Get dh1dh6 in actual coordinate system: */
    109109        GetNodalFunctionsMINIDerivatives(&dh1dh7[0][0],xyz_list, gauss);
     
    134134}
    135135/*}}}*/
    136136/*FUNCTION PentaRef::GetBPattyn {{{*/
    137 void PentaRef::GetBPattyn(double* B, double* xyz_list, GaussPenta* gauss){
     137void PentaRef::GetBPattyn(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
    138138        /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2.
    139139         * For node i, Bi can be expressed in the actual coordinate system
    140140         * by:
     
    148148         * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
    149149         */
    150150
    151         double dbasis[3][NUMNODESP1];
     151        IssmDouble dbasis[3][NUMNODESP1];
    152152
    153153        /*Get dbasis in actual coordinate system: */
    154154        GetNodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss);
     
    174174}
    175175/*}}}*/
    176176/*FUNCTION PentaRef::GetBprimePattyn {{{*/
    177 void PentaRef::GetBprimePattyn(double* B, double* xyz_list, GaussPenta* gauss_coord){
     177void PentaRef::GetBprimePattyn(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss_coord){
    178178        /*Compute B  prime matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2.
    179179         * For node i, Bi can be expressed in the actual coordinate system
    180180         * by:
     
    187187         *
    188188         * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1)
    189189         */
    190         double dbasis[3][NUMNODESP1];
     190        IssmDouble dbasis[3][NUMNODESP1];
    191191
    192192        /*Get dbasis in actual coordinate system: */
    193193        GetNodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss_coord);
     
    212212}
    213213/*}}}*/
    214214/*FUNCTION PentaRef::GetBprimeMacAyealStokes{{{*/
    215 void PentaRef::GetBprimeMacAyealStokes(double* Bprime, double* xyz_list, GaussPenta* gauss){
     215void PentaRef::GetBprimeMacAyealStokes(IssmDouble* Bprime, IssmDouble* xyz_list, GaussPenta* gauss){
    216216        /*Compute Bprime  matrix. Bprime=[Bprime1 Bprime2 Bprime3 Bprime4 Bprime5 Bprime6] where Bprimei is of size 5*NDOF2.
    217217         * For node i, Bprimei can be expressed in the actual coordinate system
    218218         * by:
     
    225225         */
    226226
    227227        int    i;
    228         double dh1dh7[3][NUMNODESMINI];
     228        IssmDouble dh1dh7[3][NUMNODESMINI];
    229229
    230230        /*Get dh1dh6 in actual coordinate system: */
    231231        GetNodalFunctionsMINIDerivatives(&dh1dh7[0][0],xyz_list, gauss);
     
    252252}
    253253/*}}}*/
    254254/*FUNCTION PentaRef::GetBStokes {{{*/
    255 void PentaRef::GetBStokes(double* B, double* xyz_list, GaussPenta* gauss){
     255void PentaRef::GetBStokes(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
    256256
    257257        /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 3*NDOF4.
    258258         * For node i, Bi can be expressed in the actual coordinate system
     
    270270
    271271        int i;
    272272
    273         double dh1dh7[3][NUMNODESMINI];
    274         double l1l6[NUMNODESP1];
     273        IssmDouble dh1dh7[3][NUMNODESMINI];
     274        IssmDouble l1l6[NUMNODESP1];
    275275
    276276        /*Get dh1dh7 in actual coordinate system: */
    277277        GetNodalFunctionsMINIDerivatives(&dh1dh7[0][0],xyz_list, gauss);
     
    319319}
    320320/*}}}*/
    321321/*FUNCTION PentaRef::GetBprimeStokes {{{*/
    322 void PentaRef::GetBprimeStokes(double* B_prime, double* xyz_list, GaussPenta* gauss){
     322void PentaRef::GetBprimeStokes(IssmDouble* B_prime, IssmDouble* xyz_list, GaussPenta* gauss){
    323323        /*      Compute B'  matrix. B'=[B1' B2' B3' B4' B5' B6' Bb'] where Bi' is of size 3*NDOF2.
    324324         *      For node i, Bi' can be expressed in the actual coordinate system
    325325         *      by:
     
    337337         */
    338338
    339339        int i;
    340         double dh1dh7[3][NUMNODESMINI];
    341         double l1l6[NUMNODESP1];
     340        IssmDouble dh1dh7[3][NUMNODESMINI];
     341        IssmDouble l1l6[NUMNODESP1];
    342342
    343343        /*Get dh1dh7 in actual coordinate system: */
    344344        GetNodalFunctionsMINIDerivatives(&dh1dh7[0][0],xyz_list, gauss);
     
    386386}
    387387/*}}}*/
    388388/*FUNCTION PentaRef::GetBAdvec{{{*/
    389 void PentaRef::GetBAdvec(double* B_advec, double* xyz_list, GaussPenta* gauss){
     389void PentaRef::GetBAdvec(IssmDouble* B_advec, IssmDouble* xyz_list, GaussPenta* gauss){
    390390        /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1.
    391391         * For node i, Bi' can be expressed in the actual coordinate system
    392392         * by:
     
    399399         */
    400400
    401401        /*Same thing in the actual coordinate system: */
    402         double l1l6[6];
     402        IssmDouble l1l6[6];
    403403
    404404        /*Get dh1dh2dh3 in actual coordinates system : */
    405405        GetNodalFunctionsP1(l1l6, gauss);
     
    413413}
    414414/*}}}*/
    415415/*FUNCTION PentaRef::GetBConduct{{{*/
    416 void PentaRef::GetBConduct(double* B_conduct, double* xyz_list, GaussPenta* gauss){
     416void PentaRef::GetBConduct(IssmDouble* B_conduct, IssmDouble* xyz_list, GaussPenta* gauss){
    417417        /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1.
    418418         * For node i, Bi' can be expressed in the actual coordinate system
    419419         * by:
     
    426426         */
    427427
    428428        /*Same thing in the actual coordinate system: */
    429         double dh1dh6[3][NUMNODESP1];
     429        IssmDouble dh1dh6[3][NUMNODESP1];
    430430
    431431        /*Get dh1dh2dh3 in actual coordinates system : */
    432432        GetNodalFunctionsP1Derivatives(&dh1dh6[0][0],xyz_list,gauss);
     
    440440}
    441441/*}}}*/
    442442/*FUNCTION PentaRef::GetBVert{{{*/
    443 void PentaRef::GetBVert(double* B, double* xyz_list, GaussPenta* gauss){
     443void PentaRef::GetBVert(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
    444444        /*      Compute B  matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
    445445                where hi is the interpolation function for node i.*/
    446446
    447447        int i;
    448         double dh1dh6[3][NUMNODESP1];
     448        IssmDouble dh1dh6[3][NUMNODESP1];
    449449
    450450        /*Get dh1dh6 in actual coordinate system: */
    451451        GetNodalFunctionsP1Derivatives(&dh1dh6[0][0],xyz_list, gauss);
     
    458458}
    459459/*}}}*/
    460460/*FUNCTION PentaRef::GetBprimeAdvec{{{*/
    461 void PentaRef::GetBprimeAdvec(double* Bprime_advec, double* xyz_list, GaussPenta* gauss){
     461void PentaRef::GetBprimeAdvec(IssmDouble* Bprime_advec, IssmDouble* xyz_list, GaussPenta* gauss){
    462462        /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1.
    463463         * For node i, Bi' can be expressed in the actual coordinate system
    464464         * by:
     
    471471         */
    472472
    473473        /*Same thing in the actual coordinate system: */
    474         double dh1dh6[3][NUMNODESP1];
     474        IssmDouble dh1dh6[3][NUMNODESP1];
    475475
    476476        /*Get dh1dh2dh3 in actual coordinates system : */
    477477        GetNodalFunctionsP1Derivatives(&dh1dh6[0][0],xyz_list,gauss);
     
    485485}
    486486/*}}}*/
    487487/*FUNCTION PentaRef::GetBprimeVert{{{*/
    488 void PentaRef::GetBprimeVert(double* B, double* xyz_list, GaussPenta* gauss){
     488void PentaRef::GetBprimeVert(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){
    489489        /* Compute Bprime  matrix. Bprime=[L1 L2 L3 L4 L5 L6] where Li is the nodal function for node i*/
    490490
    491491        GetNodalFunctionsP1(B, gauss);
     
    493493}
    494494/*}}}*/
    495495/*FUNCTION PentaRef::GetL{{{*/
    496 void PentaRef::GetL(double* L, GaussPenta* gauss, int numdof){
     496void PentaRef::GetL(IssmDouble* L, GaussPenta* gauss, int numdof){
    497497        /*Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof.
    498498         ** For node i, Li can be expressed in the actual coordinate system
    499499         ** by:
     
    508508         **/
    509509
    510510        int i;
    511         double l1l6[6];
     511        IssmDouble l1l6[6];
    512512
    513513        /*Get l1l6 in actual coordinate system: */
    514514        GetNodalFunctionsP1(l1l6,gauss);
     
    530530}
    531531/*}}}*/
    532532/*FUNCTION PentaRef::GetLStokes{{{*/
    533 void PentaRef::GetLStokes(double* LStokes, GaussPenta* gauss){
     533void PentaRef::GetLStokes(IssmDouble* LStokes, GaussPenta* gauss){
    534534        /*
    535535         * Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof.
    536536         * For node i, Li can be expressed in the actual coordinate system
     
    543543         */
    544544
    545545        const int num_dof=4;
    546         double l1l2l3[NUMNODESP1_2d];
     546        IssmDouble l1l2l3[NUMNODESP1_2d];
    547547
    548548        /*Get l1l2l3 in actual coordinate system: */
    549549        l1l2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0;
     
    565565}
    566566/*}}}*/
    567567/*FUNCTION PentaRef::GetLprimeStokes {{{*/
    568 void PentaRef::GetLprimeStokes(double* LprimeStokes, double* xyz_list, GaussPenta* gauss){
     568void PentaRef::GetLprimeStokes(IssmDouble* LprimeStokes, IssmDouble* xyz_list, GaussPenta* gauss){
    569569
    570570        /*
    571571         * Compute Lprime  matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof.
     
    605605        int i;
    606606        int num_dof=4;
    607607
    608         double l1l2l3[NUMNODESP1_2d];
    609         double dh1dh6[3][NUMNODESP1];
     608        IssmDouble l1l2l3[NUMNODESP1_2d];
     609        IssmDouble dh1dh6[3][NUMNODESP1];
    610610
    611611        /*Get l1l2l3 in actual coordinate system: */
    612612        l1l2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0;
     
    677677}
    678678/*}}}*/
    679679/*FUNCTION PentaRef::GetLMacAyealStokes {{{*/
    680 void PentaRef::GetLMacAyealStokes(double* LStokes, GaussPenta* gauss){
     680void PentaRef::GetLMacAyealStokes(IssmDouble* LStokes, GaussPenta* gauss){
    681681        /*
    682682         * Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof.
    683683         * For node i, Li can be expressed in the actual coordinate system
     
    696696        int i;
    697697        int num_dof=2;
    698698
    699         double l1l2l3[NUMNODESP1_2d];
     699        IssmDouble l1l2l3[NUMNODESP1_2d];
    700700
    701701
    702702        /*Get l1l2l3 in actual coordinate system: */
     
    727727}
    728728/*}}}*/
    729729/*FUNCTION PentaRef::GetLprimeMacAyealStokes {{{*/
    730 void PentaRef::GetLprimeMacAyealStokes(double* LprimeStokes, double* xyz_list, GaussPenta* gauss){
     730void PentaRef::GetLprimeMacAyealStokes(IssmDouble* LprimeStokes, IssmDouble* xyz_list, GaussPenta* gauss){
    731731
    732732        /*
    733733         * Compute Lprime  matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof.
     
    746746        int i;
    747747        int num_dof=4;
    748748
    749         double l1l2l3[NUMNODESP1_2d];
    750         double dh1dh6[3][NUMNODESP1];
     749        IssmDouble l1l2l3[NUMNODESP1_2d];
     750        IssmDouble dh1dh6[3][NUMNODESP1];
    751751
    752752        /*Get l1l2l3 in actual coordinate system: */
    753753        l1l2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0;
     
    794794}
    795795/*}}}*/
    796796/*FUNCTION PentaRef::GetLStokesMacAyeal {{{*/
    797 void PentaRef::GetLStokesMacAyeal(double* LStokes, GaussPenta* gauss){
     797void PentaRef::GetLStokesMacAyeal(IssmDouble* LStokes, GaussPenta* gauss){
    798798        /*
    799799         * Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof.
    800800         * For node i, Li can be expressed in the actual coordinate system
     
    809809        int i;
    810810        int num_dof=4;
    811811
    812         double l1l2l3[NUMNODESP1_2d];
     812        IssmDouble l1l2l3[NUMNODESP1_2d];
    813813
    814814
    815815        /*Get l1l2l3 in actual coordinate system: */
     
    840840}
    841841/*}}}*/
    842842/*FUNCTION PentaRef::GetLprimeStokesMacAyeal {{{*/
    843 void PentaRef::GetLprimeStokesMacAyeal(double* LprimeStokes, double* xyz_list, GaussPenta* gauss){
     843void PentaRef::GetLprimeStokesMacAyeal(IssmDouble* LprimeStokes, IssmDouble* xyz_list, GaussPenta* gauss){
    844844
    845845        /*
    846846         * Compute Lprime  matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof.
     
    855855        int i;
    856856        int num_dof=2;
    857857
    858         double l1l2l3[NUMNODESP1_2d];
    859         double dh1dh6[3][NUMNODESP1];
     858        IssmDouble l1l2l3[NUMNODESP1_2d];
     859        IssmDouble dh1dh6[3][NUMNODESP1];
    860860
    861861        /*Get l1l2l3 in actual coordinate system: */
    862862        l1l2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0;
     
    879879}
    880880/*}}}*/
    881881/*FUNCTION PentaRef::GetJacobian {{{*/
    882 void PentaRef::GetJacobian(double* J, double* xyz_list,GaussPenta* gauss){
     882void PentaRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussPenta* gauss){
    883883
    884884        int i,j;
    885885
    886886        /*The Jacobian is constant over the element, discard the gaussian points.
    887887         * J is assumed to have been allocated of size NDOF2xNDOF2.*/
    888888
    889         double A1,A2,A3; //area coordinates
    890         double xi,eta,zi; //parametric coordinates
     889        IssmDouble A1,A2,A3; //area coordinates
     890        IssmDouble xi,eta,zi; //parametric coordinates
    891891
    892         double x1,x2,x3,x4,x5,x6;
    893         double y1,y2,y3,y4,y5,y6;
    894         double z1,z2,z3,z4,z5,z6;
     892        IssmDouble x1,x2,x3,x4,x5,x6;
     893        IssmDouble y1,y2,y3,y4,y5,y6;
     894        IssmDouble z1,z2,z3,z4,z5,z6;
    895895
    896896        /*Figure out xi,eta and zi (parametric coordinates), for this gaussian point: */
    897897        A1=gauss->coord1;
     
    938938}
    939939/*}}}*/
    940940/*FUNCTION PentaRef::GetJacobianDeterminant {{{*/
    941 void PentaRef::GetJacobianDeterminant(double*  Jdet, double* xyz_list,GaussPenta* gauss){
     941void PentaRef::GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss){
    942942        /*On a penta, Jacobian varies according to coordinates. We need to get the Jacobian, and take
    943943         * the determinant of it: */
    944         double J[3][3];
     944        IssmDouble J[3][3];
    945945
    946946        /*Get Jacobian*/
    947947        GetJacobian(&J[0][0],xyz_list,gauss);
     
    953953}
    954954/*}}}*/
    955955/*FUNCTION PentaRef::GetTriaJacobianDeterminant{{{*/
    956 void PentaRef::GetTriaJacobianDeterminant(double*  Jdet, double* xyz_list,GaussPenta* gauss){
     956void PentaRef::GetTriaJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss){
    957957        /*The Jacobian determinant is constant over the element, discard the gaussian points.
    958958         * J is assumed to have been allocated of size NDOF2xNDOF2.*/
    959959
    960         double x1,x2,x3,y1,y2,y3,z1,z2,z3;
     960        IssmDouble x1,x2,x3,y1,y2,y3,z1,z2,z3;
    961961
    962962        x1=*(xyz_list+3*0+0);
    963963        y1=*(xyz_list+3*0+1);
     
    975975}
    976976/*}}}*/
    977977/*FUNCTION PentaRef::GetSegmentJacobianDeterminant{{{*/
    978 void PentaRef::GetSegmentJacobianDeterminant(double*  Jdet, double* xyz_list,GaussPenta* gauss){
     978void PentaRef::GetSegmentJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss){
    979979        /*The Jacobian determinant is constant over the element, discard the gaussian points.
    980980         * J is assumed to have been allocated of size NDOF2xNDOF2.*/
    981981
    982         double x1,x2,y1,y2,z1,z2;
     982        IssmDouble x1,x2,y1,y2,z1,z2;
    983983
    984984        x1=*(xyz_list+3*0+0);
    985985        y1=*(xyz_list+3*0+1);
     
    994994}
    995995/*}}}*/
    996996/*FUNCTION PentaRef::GetJacobianInvert {{{*/
    997 void PentaRef::GetJacobianInvert(double* Jinv, double* xyz_list,GaussPenta* gauss){
     997void PentaRef::GetJacobianInvert(IssmDouble* Jinv, IssmDouble* xyz_list,GaussPenta* gauss){
    998998
    999999        /*Jacobian*/
    1000         double J[3][3];
     1000        IssmDouble J[3][3];
    10011001
    10021002        /*Call Jacobian routine to get the jacobian:*/
    10031003        GetJacobian(&J[0][0], xyz_list, gauss);
     
    10071007}
    10081008/*}}}*/
    10091009/*FUNCTION PentaRef::GetNodalFunctionsMINI{{{*/
    1010 void PentaRef::GetNodalFunctionsMINI(double* l1l7, GaussPenta* gauss){
     1010void PentaRef::GetNodalFunctionsMINI(IssmDouble* l1l7, GaussPenta* gauss){
    10111011        /*This routine returns the values of the nodal functions  at the gaussian point.*/
    10121012
    10131013        l1l7[0]=gauss->coord1*(1.0-gauss->coord4)/2.0;
     
    10211021}
    10221022/*}}}*/
    10231023/*FUNCTION PentaRef::GetNodalFunctionsMINIDerivatives{{{*/
    1024 void PentaRef::GetNodalFunctionsMINIDerivatives(double* dh1dh7,double* xyz_list, GaussPenta* gauss){
     1024void PentaRef::GetNodalFunctionsMINIDerivatives(IssmDouble* dh1dh7,IssmDouble* xyz_list, GaussPenta* gauss){
    10251025
    10261026        /*This routine returns the values of the nodal functions derivatives  (with respect to the
    10271027         * actual coordinate system): */
    10281028
    10291029        int       i;
    1030         double    dh1dh7_ref[3][NUMNODESMINI];
    1031         double    Jinv[3][3];
     1030        IssmDouble    dh1dh7_ref[3][NUMNODESMINI];
     1031        IssmDouble    Jinv[3][3];
    10321032
    10331033        /*Get derivative values with respect to parametric coordinate system: */
    10341034        GetNodalFunctionsMINIDerivativesReference(&dh1dh7_ref[0][0], gauss);
     
    10521052}
    10531053/*}}}*/
    10541054/*FUNCTION PentaRef::GetNodalFunctionsMINIDerivativesReference{{{*/
    1055 void PentaRef::GetNodalFunctionsMINIDerivativesReference(double* dl1dl7,GaussPenta* gauss){
     1055void PentaRef::GetNodalFunctionsMINIDerivativesReference(IssmDouble* dl1dl7,GaussPenta* gauss){
    10561056
    10571057        /*This routine returns the values of the nodal functions derivatives  (with respect to the
    10581058         * natural coordinate system) at the gaussian point. */
    1059         double r=gauss->coord2-gauss->coord1;
    1060         double s=-3.0/SQRT3*(gauss->coord1+gauss->coord2-2.0/3.0);
    1061         double zeta=gauss->coord4;
     1059        IssmDouble r=gauss->coord2-gauss->coord1;
     1060        IssmDouble s=-3.0/SQRT3*(gauss->coord1+gauss->coord2-2.0/3.0);
     1061        IssmDouble zeta=gauss->coord4;
    10621062
    10631063        /*First nodal function: */
    10641064        *(dl1dl7+NUMNODESMINI*0+0)=-0.5*(1.0-zeta)/2.0;
     
    10981098}
    10991099/*}}}*/
    11001100/*FUNCTION PentaRef::GetNodalFunctionsP1 {{{*/
    1101 void PentaRef::GetNodalFunctionsP1(double* l1l6, GaussPenta* gauss){
     1101void PentaRef::GetNodalFunctionsP1(IssmDouble* l1l6, GaussPenta* gauss){
    11021102        /*This routine returns the values of the nodal functions  at the gaussian point.*/
    11031103
    11041104        l1l6[0]=gauss->coord1*(1-gauss->coord4)/2.0;
     
    11111111}
    11121112/*}}}*/
    11131113/*FUNCTION PentaRef::GetNodalFunctionsP1Derivatives {{{*/
    1114 void PentaRef::GetNodalFunctionsP1Derivatives(double* dh1dh6,double* xyz_list, GaussPenta* gauss){
     1114void PentaRef::GetNodalFunctionsP1Derivatives(IssmDouble* dh1dh6,IssmDouble* xyz_list, GaussPenta* gauss){
    11151115
    11161116        /*This routine returns the values of the nodal functions derivatives  (with respect to the
    11171117         * actual coordinate system): */
    1118         double    dh1dh6_ref[NDOF3][NUMNODESP1];
    1119         double    Jinv[NDOF3][NDOF3];
     1118        IssmDouble    dh1dh6_ref[NDOF3][NUMNODESP1];
     1119        IssmDouble    Jinv[NDOF3][NDOF3];
    11201120
    11211121        /*Get derivative values with respect to parametric coordinate system: */
    11221122        GetNodalFunctionsP1DerivativesReference(&dh1dh6_ref[0][0], gauss);
     
    11401140}
    11411141/*}}}*/
    11421142/*FUNCTION PentaRef::GetNodalFunctionsP1DerivativesReference {{{*/
    1143 void PentaRef::GetNodalFunctionsP1DerivativesReference(double* dl1dl6,GaussPenta* gauss){
     1143void PentaRef::GetNodalFunctionsP1DerivativesReference(IssmDouble* dl1dl6,GaussPenta* gauss){
    11441144
    11451145        /*This routine returns the values of the nodal functions derivatives  (with respect to the
    11461146         * natural coordinate system) at the gaussian point. Those values vary along xi,eta,z */
    11471147
    1148         double A1,A2,A3,z;
     1148        IssmDouble A1,A2,A3,z;
    11491149
    11501150        A1=gauss->coord1; _assert_(A1>=0 && A1<=1);//first area coordinate value. In term of xi and eta: A1=(1-xi)/2-eta/(2*SQRT3);
    11511151        A2=gauss->coord2; _assert_(A2>=0 && A2<=1);//second area coordinate value In term of xi and eta: A2=(1+xi)/2-eta/(2*SQRT3);
     
    11841184}
    11851185/*}}}*/
    11861186/*FUNCTION PentaRef::GetQuadNodalFunctions {{{*/
    1187 void PentaRef::GetQuadNodalFunctions(double* l1l4,GaussPenta* gauss,int index1,int index2,int index3,int index4){
     1187void PentaRef::GetQuadNodalFunctions(IssmDouble* l1l4,GaussPenta* gauss,int index1,int index2,int index3,int index4){
    11881188        /*This routine returns the values of the nodal functions  at the gaussian point.*/
    11891189
    1190         double BasisFunctions[6];
     1190        IssmDouble BasisFunctions[6];
    11911191
    11921192        GetNodalFunctionsP1(&BasisFunctions[0],gauss);
    11931193
     
    12041204}
    12051205/*}}}*/
    12061206/*FUNCTION PentaRef::GetQuadJacobianDeterminant{{{*/
    1207 void PentaRef::GetQuadJacobianDeterminant(double* Jdet,double xyz_list[4][3],GaussPenta* gauss){
     1207void PentaRef::GetQuadJacobianDeterminant(IssmDouble* Jdet,IssmDouble xyz_list[4][3],GaussPenta* gauss){
    12081208        /*This routine returns the values of the nodal functions  at the gaussian point.*/
    12091209
    1210         double x1,x2,x3,x4,y1,y2,y3,y4,z1,z2,z3,z4;
     1210        IssmDouble x1,x2,x3,x4,y1,y2,y3,y4,z1,z2,z3,z4;
    12111211
    12121212        x1=xyz_list[0][0];
    12131213        y1=xyz_list[0][1];
     
    12301230}
    12311231/*}}}*/
    12321232/*FUNCTION PentaRef::GetInputValue{{{*/
    1233 void PentaRef::GetInputValue(double* pvalue,double* plist,GaussPenta* gauss){
     1233void PentaRef::GetInputValue(IssmDouble* pvalue,IssmDouble* plist,GaussPenta* gauss){
    12341234        /*P1 interpolation on Gauss point*/
    12351235
    12361236        /*intermediary*/
    1237         double l1l6[6];
     1237        IssmDouble l1l6[6];
    12381238
    12391239        /*nodal functions: */
    12401240        GetNodalFunctionsP1(&l1l6[0],gauss);
     
    12451245}
    12461246/*}}}*/
    12471247/*FUNCTION PentaRef::GetInputDerivativeValue{{{*/
    1248 void PentaRef::GetInputDerivativeValue(double* p, double* plist,double* xyz_list, GaussPenta* gauss){
     1248void PentaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussPenta* gauss){
    12491249        /*From node values of parameter p (p_list[0], p_list[1], p_list[2], p_list[3], p_list[4] and p_list[4]), return parameter derivative value at gaussian point specified by gauss_coord:
    12501250         *   dp/dx=p_list[0]*dh1/dx+p_list[1]*dh2/dx+p_list[2]*dh3/dx+p_list[3]*dh4/dx+p_list[4]*dh5/dx+p_list[5]*dh6/dx;
    12511251         *   dp/dy=p_list[0]*dh1/dy+p_list[1]*dh2/dy+p_list[2]*dh3/dy+p_list[3]*dh4/dy+p_list[4]*dh5/dy+p_list[5]*dh6/dy;
     
    12531253         *
    12541254         *   p is a vector of size 3x1 already allocated.
    12551255         */
    1256         double dh1dh6[3][NUMNODESP1];
     1256        IssmDouble dh1dh6[3][NUMNODESP1];
    12571257
    12581258        /*Get nodal funnctions derivatives in actual coordinate system: */
    12591259        GetNodalFunctionsP1Derivatives(&dh1dh6[0][0],xyz_list, gauss);
  • u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/Tria.h

     
    5454                Object* copy();
    5555                /*}}}*/
    5656                /*Update virtual functions resolution: {{{*/
    57                 void  InputUpdateFromSolution(double* solutiong);
    58                 void  InputUpdateFromVector(double* vector, int name, int type);
     57                void  InputUpdateFromSolution(IssmDouble* solutiong);
     58                void  InputUpdateFromVector(IssmDouble* vector, int name, int type);
    5959                void  InputUpdateFromVector(int* vector, int name, int type);
    6060                void  InputUpdateFromVector(bool* vector, int name, int type);
    6161                #ifdef _HAVE_DAKOTA_
    62                 void  InputUpdateFromVectorDakota(double* vector, int name, int type);
     62                void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);
    6363                void  InputUpdateFromVectorDakota(int* vector, int name, int type);
    6464                void  InputUpdateFromVectorDakota(bool* vector, int name, int type);
    65                 void  InputUpdateFromMatrixDakota(double* matrix, int nows, int ncols, int name, int type);
     65                void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nows, int ncols, int name, int type);
    6666                #endif
    67                 void  InputUpdateFromConstant(double constant, int name);
     67                void  InputUpdateFromConstant(IssmDouble constant, int name);
    6868                void  InputUpdateFromConstant(int constant, int name);
    6969                void  InputUpdateFromConstant(bool constant, int name);
    7070                void  InputUpdateFromIoModel(int index, IoModel* iomodel);
    7171                /*}}}*/
    7272                /*Element virtual functions definitions: {{{*/
    73                 void   AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,double* vertex_response,double* qmu_part);
     73                void   AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
    7474                void   ComputeBasalStress(Vector* sigma_b);
    7575                void   ComputeStrainRate(Vector* eps);
    7676                void   ComputeStressTensor();
     
    8484                bool   IsOnBed();
    8585                bool   IsFloating();
    8686                bool   IsNodeOnShelf();
    87                 bool   IsNodeOnShelfFromFlags(double* flags);
     87                bool   IsNodeOnShelfFromFlags(IssmDouble* flags);
    8888                bool   IsOnWater();
    8989                void   GetSolutionFromInputs(Vector* solution);
    9090                void   GetVectorFromInputs(Vector* vector, int name_enum);
    9191                void   GetVectorFromResults(Vector* vector,int offset,int interp);
    92                 void   InputArtificialNoise(int enum_type,double min, double max);
    93                 bool   InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums);
    94                 void   InputCreate(double scalar,int name,int code);
    95                 void   InputCreate(double* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
     92                void   InputArtificialNoise(int enum_type,IssmDouble min, IssmDouble max);
     93                bool   InputConvergence(IssmDouble* eps, int* enums,int num_enums,int* criterionenums,IssmDouble* criterionvalues,int num_criterionenums);
     94                void   InputCreate(IssmDouble scalar,int name,int code);
     95                void   InputCreate(IssmDouble* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
    9696                void   InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum=MeshElementsEnum);
    9797                void   InputDuplicate(int original_enum,int new_enum);
    98                 void   InputScale(int enum_type,double scale_factor);
    99                 void   InputToResult(int enum_type,int step,double time);
     98                void   InputScale(int enum_type,IssmDouble scale_factor);
     99                void   InputToResult(int enum_type,int step,IssmDouble time);
    100100                void   DeleteResults(void);
    101101                void   MaterialUpdateFromTemperature(void){_error_("not implemented yet");};
    102                 void   MigrateGroundingLine(double* oldfloating,double* sheet_ungrounding);
    103                 int    NodalValue(double* pvalue, int index, int natureofdataenum,bool process_units);
     102                void   MigrateGroundingLine(IssmDouble* oldfloating,IssmDouble* sheet_ungrounding);
     103                int    NodalValue(IssmDouble* pvalue, int index, int natureofdataenum,bool process_units);
    104104                void   PotentialSheetUngrounding(Vector* potential_sheet_ungrounding);
    105                 void   PositiveDegreeDay(double* pdds,double* pds,double signorm);
    106                 void   RequestedOutput(int output_enum,int step,double time);
    107                 void   ListResultsInfo(int** results_enums,int** results_size,double** results_times,int** results_steps,int* num_results);
     105                void   PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm);
     106                void   RequestedOutput(int output_enum,int step,IssmDouble time);
     107                void   ListResultsInfo(int** results_enums,int** results_size,IssmDouble** results_times,int** results_steps,int* num_results);
    108108                void   PatchFill(int* pcount, Patch* patch);
    109109                void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes);
    110110                void   ProcessResultsUnits(void);
    111111                void   ResetCoordinateSystem(void){_error_("not implemented yet");};
    112                 double SurfaceArea(void);
     112                IssmDouble SurfaceArea(void);
    113113                void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type);
    114                 int    UpdatePotentialSheetUngrounding(double* vertices_potentially_ungrounding,Vector* vec_nodes_on_iceshelf,double* nodes_on_iceshelf);
    115                 double TimeAdapt();
     114                int    UpdatePotentialSheetUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf);
     115                IssmDouble TimeAdapt();
    116116                int*   GetHorizontalNeighboorSids(void);
    117                 void   SmearFunction(Vector* smearedvector,double (*WeightFunction)(double distance,double radius),double radius);
     117                void   SmearFunction(Vector* smearedvector,IssmDouble (*WeightFunction)(IssmDouble distance,IssmDouble radius),IssmDouble radius);
    118118
    119119                #ifdef _HAVE_RESPONSES_
    120                 double IceVolume(void);
    121                 void   MinVel(double* pminvel, bool process_units);
    122                 void   MinVx(double* pminvx, bool process_units);
    123                 void   MinVy(double* pminvy, bool process_units);
    124                 void   MinVz(double* pminvz, bool process_units);
    125                 double MassFlux(double* segment,bool process_units);
    126                 void   MaxAbsVx(double* pmaxabsvx, bool process_units);
    127                 void   MaxAbsVy(double* pmaxabsvy, bool process_units);
    128                 void   MaxAbsVz(double* pmaxabsvz, bool process_units);
    129                 void   ElementResponse(double* presponse,int response_enum,bool process_units);
    130                 void   MaxVel(double* pmaxvel, bool process_units);
    131                 void   MaxVx(double* pmaxvx, bool process_units);
    132                 void   MaxVy(double* pmaxvy, bool process_units);
    133                 void   MaxVz(double* pmaxvz, bool process_units);
     120                IssmDouble IceVolume(void);
     121                void   MinVel(IssmDouble* pminvel, bool process_units);
     122                void   MinVx(IssmDouble* pminvx, bool process_units);
     123                void   MinVy(IssmDouble* pminvy, bool process_units);
     124                void   MinVz(IssmDouble* pminvz, bool process_units);
     125                IssmDouble MassFlux(IssmDouble* segment,bool process_units);
     126                void   MaxAbsVx(IssmDouble* pmaxabsvx, bool process_units);
     127                void   MaxAbsVy(IssmDouble* pmaxabsvy, bool process_units);
     128                void   MaxAbsVz(IssmDouble* pmaxabsvz, bool process_units);
     129                void   ElementResponse(IssmDouble* presponse,int response_enum,bool process_units);
     130                void   MaxVel(IssmDouble* pmaxvel, bool process_units);
     131                void   MaxVx(IssmDouble* pmaxvx, bool process_units);
     132                void   MaxVy(IssmDouble* pmaxvy, bool process_units);
     133                void   MaxVz(IssmDouble* pmaxvz, bool process_units);
    134134                #endif
    135135
    136136
    137137                #ifdef _HAVE_CONTROL_
    138                 double DragCoefficientAbsGradient(bool process_units,int weight_index);
     138                IssmDouble DragCoefficientAbsGradient(bool process_units,int weight_index);
    139139                void   GradientIndexing(int* indexing,int control_index);
    140140                void   Gradj(Vector* gradient,int control_type,int control_index);
    141141                void   GradjBGradient(Vector* gradient,int weight_index,int control_index);
     
    147147                void   GradjVxBalancedthickness(Vector* gradient,int control_index);
    148148                void   GradjVyBalancedthickness(Vector* gradient,int control_index);
    149149                void   GetVectorFromControlInputs(Vector* gradient,int control_enum,int control_index,const char* data);
    150                 void   SetControlInputsFromVector(double* vector,int control_enum,int control_index);
     150                void   SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
    151151                void   ControlInputGetGradient(Vector* gradient,int enum_type,int control_index);
    152                 void   ControlInputScaleGradient(int enum_type,double scale);
    153                 void   ControlInputSetGradient(double* gradient,int enum_type,int control_index);
    154                 double RheologyBbarAbsGradient(bool process_units,int weight_index);
    155                 double ThicknessAbsMisfit(     bool process_units,int weight_index);
    156                 double SurfaceAbsVelMisfit(    bool process_units,int weight_index);
    157                 double ThicknessAbsGradient(bool process_units,int weight_index);
    158                 double SurfaceRelVelMisfit(    bool process_units,int weight_index);
    159                 double SurfaceLogVelMisfit(    bool process_units,int weight_index);
    160                 double SurfaceLogVxVyMisfit(   bool process_units,int weight_index);
    161                 double SurfaceAverageVelMisfit(bool process_units,int weight_index);
    162                 void   InputControlUpdate(double scalar,bool save_parameter);
     152                void   ControlInputScaleGradient(int enum_type,IssmDouble scale);
     153                void   ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
     154                IssmDouble RheologyBbarAbsGradient(bool process_units,int weight_index);
     155                IssmDouble ThicknessAbsMisfit(     bool process_units,int weight_index);
     156                IssmDouble SurfaceAbsVelMisfit(    bool process_units,int weight_index);
     157                IssmDouble ThicknessAbsGradient(bool process_units,int weight_index);
     158                IssmDouble SurfaceRelVelMisfit(    bool process_units,int weight_index);
     159                IssmDouble SurfaceLogVelMisfit(    bool process_units,int weight_index);
     160                IssmDouble SurfaceLogVxVyMisfit(   bool process_units,int weight_index);
     161                IssmDouble SurfaceAverageVelMisfit(bool process_units,int weight_index);
     162                void   InputControlUpdate(IssmDouble scalar,bool save_parameter);
    163163                #endif
    164164
    165165                /*}}}*/
     
    179179                ElementVector* CreatePVectorPrognostic_CG(void);
    180180                ElementVector* CreatePVectorPrognostic_DG(void);
    181181                ElementVector* CreatePVectorSlope(void);
    182                 double         GetArea(void);
     182                IssmDouble         GetArea(void);
    183183                int            GetElementType(void);
    184184                void             GetDofList(int** pdoflist,int approximation_enum,int setenum);
    185185                void             GetDofList1(int* doflist);
    186186                void           GetSidList(int* sidlist);
    187187                void           GetConnectivityList(int* connectivity);
    188                 void           GetInputListOnVertices(double* pvalue,int enumtype);
    189                 void           GetInputListOnVertices(double* pvalue,int enumtype,double defaultvalue);
    190                 void           GetInputListOnVertices(double* pvalue,int enumtype,double defaultvalue,int index); //TO BE REMOVED
    191                 void           GetInputValue(double* pvalue,Node* node,int enumtype);
    192                 void           GetStrainRate2d(double* epsilon,double* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input);
    193                 void             InputUpdateFromSolutionOneDof(double* solution,int enum_type);
    194                 void             InputUpdateFromSolutionPrognostic(double* solution);
     188                void           GetInputListOnVertices(IssmDouble* pvalue,int enumtype);
     189                void           GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
     190                void           GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue,int index); //TO BE REMOVED
     191                void           GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
     192                void           GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input);
     193                void             InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type);
     194                void             InputUpdateFromSolutionPrognostic(IssmDouble* solution);
    195195                bool             IsInput(int name);
    196196                void             SetClone(int* minranks);
    197                 void             SurfaceNormal(double* surface_normal, double xyz_list[3][3]);
     197                void             SurfaceNormal(IssmDouble* surface_normal, IssmDouble xyz_list[3][3]);
    198198               
    199199                #ifdef _HAVE_DIAGNOSTIC_
    200200                ElementMatrix* CreateKMatrixDiagnosticMacAyeal(void);
     
    206206                ElementMatrix* CreateJacobianDiagnosticMacayeal(void);
    207207                void      GetSolutionFromInputsDiagnosticHoriz(Vector* solution);
    208208                void      GetSolutionFromInputsDiagnosticHutter(Vector* solution);
    209                 void      InputUpdateFromSolutionDiagnosticHoriz( double* solution);
    210                 void      InputUpdateFromSolutionDiagnosticHutter( double* solution);
     209                void      InputUpdateFromSolutionDiagnosticHoriz( IssmDouble* solution);
     210                void      InputUpdateFromSolutionDiagnosticHutter( IssmDouble* solution);
    211211                #endif
    212212
    213213                #ifdef _HAVE_CONTROL_
     
    216216                ElementVector* CreatePVectorAdjointHoriz(void);
    217217                ElementVector* CreatePVectorAdjointStokes(void);
    218218                ElementVector* CreatePVectorAdjointBalancethickness(void);
    219                 void      InputUpdateFromSolutionAdjointBalancethickness( double* solution);
    220                 void      InputUpdateFromSolutionAdjointHoriz( double* solution);
     219                void      InputUpdateFromSolutionAdjointBalancethickness( IssmDouble* solution);
     220                void      InputUpdateFromSolutionAdjointHoriz( IssmDouble* solution);
    221221                #endif
    222222
    223223                #ifdef _HAVE_HYDROLOGY_
     
    225225                ElementVector* CreatePVectorHydrology(void);
    226226                void      CreateHydrologyWaterVelocityInput(void);
    227227                void      GetSolutionFromInputsHydrology(Vector* solution);
    228                 void      InputUpdateFromSolutionHydrology(double* solution);
     228                void      InputUpdateFromSolutionHydrology(IssmDouble* solution);
    229229                #endif
    230230                #ifdef _HAVE_BALANCED_
    231231                #endif
  • u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/Penta.cpp

     
    144144
    145145/*Other*/
    146146/*FUNCTION Penta::AverageOntoPartition {{{*/
    147 void  Penta::AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,double* vertex_response,double* qmu_part){
     147void  Penta::AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){
    148148        _error_("Not supported yet!");
    149149}
    150150/*}}}*/
    151151/*FUNCTION Penta::BedNormal {{{*/
    152 void Penta::BedNormal(double* bed_normal, double xyz_list[3][3]){
     152void Penta::BedNormal(IssmDouble* bed_normal, IssmDouble xyz_list[3][3]){
    153153
    154154        int i;
    155         double v13[3],v23[3];
    156         double normal[3];
    157         double normal_norm;
     155        IssmDouble v13[3],v23[3];
     156        IssmDouble normal[3];
     157        IssmDouble normal_norm;
    158158
    159159        for (i=0;i<3;i++){
    160160                v13[i]=xyz_list[0][i]-xyz_list[2][i];
     
    180180
    181181        /*Intermediaries */
    182182        int    count,ig;
    183         double basalfriction[NUMVERTICES]={0,0,0,0,0,0};
    184         double alpha2,vx,vy;
     183        IssmDouble basalfriction[NUMVERTICES]={0,0,0,0,0,0};
     184        IssmDouble alpha2,vx,vy;
    185185        Friction*  friction=NULL;
    186186        GaussPenta* gauss=NULL;
    187187
     
    232232        int         dofp[1]={3};
    233233        int         analysis_type,approximation;
    234234        int         doflist[NUMVERTICES];
    235         double      xyz_list[NUMVERTICES][3];
    236         double      xyz_list_tria[3][3];
    237         double      rho_ice,gravity,stokesreconditioning;
    238         double      pressure,viscosity,bed,Jdet2d;
    239         double      bed_normal[3];
    240         double      basalforce[3];
    241         double      epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
    242         double      devstresstensor[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
    243         double      stresstensor[6]={0.0};
    244         double      sigma_xx,sigma_yy,sigma_zz;
    245         double      sigma_xy,sigma_xz,sigma_yz;
    246         double      surface=0,value=0;
     235        IssmDouble      xyz_list[NUMVERTICES][3];
     236        IssmDouble      xyz_list_tria[3][3];
     237        IssmDouble      rho_ice,gravity,stokesreconditioning;
     238        IssmDouble      pressure,viscosity,bed,Jdet2d;
     239        IssmDouble      bed_normal[3];
     240        IssmDouble      basalforce[3];
     241        IssmDouble      epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
     242        IssmDouble      devstresstensor[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
     243        IssmDouble      stresstensor[6]={0.0};
     244        IssmDouble      sigma_xx,sigma_yy,sigma_zz;
     245        IssmDouble      sigma_xy,sigma_xz,sigma_yz;
     246        IssmDouble      surface=0,value=0;
    247247        GaussPenta* gauss;
    248248
    249249        /*retrive parameters: */
     
    325325void  Penta::ComputeStressTensor(){
    326326
    327327        int         iv;
    328         double      xyz_list[NUMVERTICES][3];
    329         double      pressure,viscosity;
    330         double      epsilon[6]; /* epsilon=[exx,eyy,exy];*/
    331         double      sigma_xx[NUMVERTICES];
    332         double          sigma_yy[NUMVERTICES];
    333         double          sigma_zz[NUMVERTICES];
    334         double      sigma_xy[NUMVERTICES];
    335         double          sigma_xz[NUMVERTICES];
    336         double          sigma_yz[NUMVERTICES];
     328        IssmDouble      xyz_list[NUMVERTICES][3];
     329        IssmDouble      pressure,viscosity;
     330        IssmDouble      epsilon[6]; /* epsilon=[exx,eyy,exy];*/
     331        IssmDouble      sigma_xx[NUMVERTICES];
     332        IssmDouble              sigma_yy[NUMVERTICES];
     333        IssmDouble              sigma_zz[NUMVERTICES];
     334        IssmDouble      sigma_xy[NUMVERTICES];
     335        IssmDouble              sigma_xz[NUMVERTICES];
     336        IssmDouble              sigma_yz[NUMVERTICES];
    337337        GaussPenta* gauss=NULL;
    338338
    339339        /* Get node coordinates and dof list: */
     
    763763}
    764764/*}}}*/
    765765/*FUNCTION Penta::GetElementSizes{{{*/
    766 void Penta::GetElementSizes(double* hx,double* hy,double* hz){
     766void Penta::GetElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){
    767767
    768         double xyz_list[NUMVERTICES][3];
    769         double xmin,ymin,zmin;
    770         double xmax,ymax,zmax;
     768        IssmDouble xyz_list[NUMVERTICES][3];
     769        IssmDouble xmin,ymin,zmin;
     770        IssmDouble xmax,ymax,zmax;
    771771
    772772        /*Get xyz list: */
    773773        GetVerticesCoordinates(&xyz_list[0][0],nodes,NUMVERTICES);
     
    819819
    820820}
    821821/*}}}*/
    822 /*FUNCTION Penta::GetInputListOnVertices(double* pvalue,int enumtype) {{{*/
    823 void Penta::GetInputListOnVertices(double* pvalue,int enumtype){
     822/*FUNCTION Penta::GetInputListOnVertices(IssmDouble* pvalue,int enumtype) {{{*/
     823void Penta::GetInputListOnVertices(IssmDouble* pvalue,int enumtype){
    824824
    825825        /*Intermediaries*/
    826         double     value[NUMVERTICES];
     826        IssmDouble     value[NUMVERTICES];
    827827        GaussPenta *gauss              = NULL;
    828828
    829829        /*Recover input*/
     
    844844        delete gauss;
    845845}
    846846/*}}}*/
    847 /*FUNCTION Penta::GetInputListOnVertices(double* pvalue,int enumtype,double defaultvalue) {{{*/
    848 void Penta::GetInputListOnVertices(double* pvalue,int enumtype,double defaultvalue){
     847/*FUNCTION Penta::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue) {{{*/
     848void Penta::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue){
    849849
    850850        /*Intermediaries*/
    851         double     value[NUMVERTICES];
     851        IssmDouble     value[NUMVERTICES];
    852852        GaussPenta *gauss              = NULL;
    853853
    854854        /*Recover input*/
     
    873873        delete gauss;
    874874}
    875875/*}}}*/
    876 /*FUNCTION Penta::GetInputValue(double* pvalue,Node* node,int enumtype) {{{*/
    877 void Penta::GetInputValue(double* pvalue,Node* node,int enumtype){
     876/*FUNCTION Penta::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype) {{{*/
     877void Penta::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){
    878878
    879879        Input* input=inputs->GetInput(enumtype);
    880880        if(!input) _error_("No input of type %s found in tria",EnumToStringx(enumtype));
     
    887887}
    888888/*}}}*/
    889889/*FUNCTION Penta::GetPhi {{{*/
    890 void Penta::GetPhi(double* phi, double*  epsilon, double viscosity){
     890void Penta::GetPhi(IssmDouble* phi, IssmDouble*  epsilon, IssmDouble viscosity){
    891891        /*Compute deformational heating from epsilon and viscosity */
    892892
    893         double epsilon_matrix[3][3];
    894         double epsilon_eff;
    895         double epsilon_sqr[3][3];
     893        IssmDouble epsilon_matrix[3][3];
     894        IssmDouble epsilon_eff;
     895        IssmDouble epsilon_sqr[3][3];
    896896
    897897        /* Build epsilon matrix */
    898898        epsilon_matrix[0][0]=*(epsilon+0);
     
    977977}
    978978/*}}}*/
    979979/*FUNCTION Penta::GetStabilizationParameter {{{*/
    980 double Penta::GetStabilizationParameter(double u, double v, double w, double diameter, double kappa){
     980IssmDouble Penta::GetStabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){
    981981        /*Compute stabilization parameter*/
    982982        /*kappa=thermalconductivity/(rho_ice*hearcapacity) for thermal model*/
    983983        /*kappa=enthalpydiffusionparameter for enthalpy model*/
    984984
    985         double normu;
    986         double tau_parameter;
     985        IssmDouble normu;
     986        IssmDouble tau_parameter;
    987987
    988988        normu=pow(pow(u,2)+pow(v,2)+pow(w,2),0.5);
    989989        if(normu*diameter/(3*2*kappa)<1){
     
    995995}
    996996/*}}}*/
    997997/*FUNCTION Penta::GetStrainRate3dPattyn{{{*/
    998 void Penta::GetStrainRate3dPattyn(double* epsilon,double* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input){
     998void Penta::GetStrainRate3dPattyn(IssmDouble* epsilon,IssmDouble* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input){
    999999        /*Compute the 3d Blatter/PattynStrain Rate (5 components):
    10001000         *
    10011001         * epsilon=[exx eyy exy exz eyz]
     
    10071007         */
    10081008
    10091009        int i;
    1010         double epsilonvx[5];
    1011         double epsilonvy[5];
     1010        IssmDouble epsilonvx[5];
     1011        IssmDouble epsilonvy[5];
    10121012
    10131013        /*Check that both inputs have been found*/
    10141014        if (!vx_input || !vy_input){
     
    10241024}
    10251025/*}}}*/
    10261026/*FUNCTION Penta::GetStrainRate3d{{{*/
    1027 void Penta::GetStrainRate3d(double* epsilon,double* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input, Input* vz_input){
     1027void Penta::GetStrainRate3d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input, Input* vz_input){
    10281028        /*Compute the 3d Strain Rate (6 components):
    10291029         *
    10301030         * epsilon=[exx eyy ezz exy exz eyz]
    10311031         */
    10321032
    10331033        int i;
    1034         double epsilonvx[6];
    1035         double epsilonvy[6];
    1036         double epsilonvz[6];
     1034        IssmDouble epsilonvx[6];
     1035        IssmDouble epsilonvy[6];
     1036        IssmDouble epsilonvz[6];
    10371037
    10381038        /*Check that both inputs have been found*/
    10391039        if (!vx_input || !vy_input || !vz_input){
     
    10991099}
    11001100/*}}}*/
    11011101/*FUNCTION Penta::GetZcoord {{{*/
    1102 double Penta::GetZcoord(GaussPenta* gauss){
     1102IssmDouble Penta::GetZcoord(GaussPenta* gauss){
    11031103
    11041104        int    i;
    1105         double z;
    1106         double xyz_list[NUMVERTICES][3];
    1107         double z_list[NUMVERTICES];
     1105        IssmDouble z;
     1106        IssmDouble xyz_list[NUMVERTICES][3];
     1107        IssmDouble z_list[NUMVERTICES];
    11081108
    11091109        GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES);
    11101110        for(i=0;i<NUMVERTICES;i++) z_list[i]=xyz_list[i][2];
     
    11261126}
    11271127/*}}}*/
    11281128/*FUNCTION Penta::InputArtificialNoise{{{*/
    1129 void  Penta::InputArtificialNoise(int enum_type,double min,double max){
     1129void  Penta::InputArtificialNoise(int enum_type,IssmDouble min,IssmDouble max){
    11301130
    11311131        Input* input=NULL;
    11321132
     
    11391139}
    11401140/*}}}*/
    11411141/*FUNCTION Penta::InputConvergence{{{*/
    1142 bool Penta::InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums){
     1142bool Penta::InputConvergence(IssmDouble* eps, int* enums,int num_enums,int* criterionenums,IssmDouble* criterionvalues,int num_criterionenums){
    11431143
    11441144        int i;
    11451145        bool    converged=true;
     
    11701170        return converged;
    11711171}
    11721172/*}}}*/
    1173 /*FUNCTION Penta::InputCreate(double scalar,int enum,int code);{{{*/
    1174 void Penta::InputCreate(double scalar,int name,int code){
     1173/*FUNCTION Penta::InputCreate(IssmDouble scalar,int enum,int code);{{{*/
     1174void Penta::InputCreate(IssmDouble scalar,int name,int code){
    11751175
    11761176        /*Check that name is an element input*/
    11771177        if (!IsInput(name)) return;
     
    11821182        else if ((code==6) || (code==2)){ //integer
    11831183                this->inputs->AddInput(new IntInput(name,(int)scalar));
    11841184        }
    1185         else if ((code==7) || (code==3)){ //double
    1186                 this->inputs->AddInput(new DoubleInput(name,(double)scalar));
     1185        else if ((code==7) || (code==3)){ //IssmDouble
     1186                this->inputs->AddInput(new DoubleInput(name,(IssmDouble)scalar));
    11871187        }
    11881188        else _error_("%s%i"," could not recognize nature of vector from code ",code);
    11891189
    11901190}
    11911191/*}}}*/
    1192 /*FUNCTION Penta::InputCreate(double* vector,int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){{{*/
    1193 void Penta::InputCreate(double* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){//index into elements
     1192/*FUNCTION Penta::InputCreate(IssmDouble* vector,int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){{{*/
     1193void Penta::InputCreate(IssmDouble* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){//index into elements
    11941194
    11951195        /*Intermediaries*/
    11961196        int    i,j,t;
    11971197        int    penta_vertex_ids[6];
    11981198        int    row;
    1199         double nodeinputs[6];
    1200         double time;
     1199        IssmDouble nodeinputs[6];
     1200        IssmDouble time;
    12011201        TransientInput* transientinput=NULL;
    12021202
    12031203        int    numberofvertices;
    12041204        int    numberofelements;
    1205         double yts;
     1205        IssmDouble yts;
    12061206
    12071207        /*Fetch parameters: */
    12081208        iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum);
     
    12211221                if(M==numberofvertices){
    12221222
    12231223                        /*create input values: */
    1224                         for(i=0;i<6;i++)nodeinputs[i]=(double)vector[penta_vertex_ids[i]-1];
     1224                        for(i=0;i<6;i++)nodeinputs[i]=(IssmDouble)vector[penta_vertex_ids[i]-1];
    12251225
    12261226                        /*process units: */
    12271227                        UnitConversion(&nodeinputs[0], 6 ,ExtToIuEnum, vector_enum);
     
    12361236                                /*create input values: */
    12371237                                for(i=0;i<6;i++){
    12381238                                        row=penta_vertex_ids[i]-1;
    1239                                         nodeinputs[i]=(double)vector[N*row+t];
     1239                                        nodeinputs[i]=(IssmDouble)vector[N*row+t];
    12401240                                }
    12411241
    12421242                                /*process units: */
    12431243                                UnitConversion(&nodeinputs[0], 6 ,ExtToIuEnum, vector_enum);
    12441244
    12451245                                /*time? :*/
    1246                                 time=(double)vector[(M-1)*N+t]*yts;
     1246                                time=(IssmDouble)vector[(M-1)*N+t]*yts;
    12471247
    12481248                                if(t==0)transientinput=new TransientInput(vector_enum);
    12491249                                transientinput->AddTimeInput(new PentaP1Input(vector_enum,nodeinputs),time);
     
    12641264                        else if (code==6){ //integer
    12651265                                this->inputs->AddInput(new IntInput(vector_enum,(int)vector[index]));
    12661266                        }
    1267                         else if (code==7){ //double
    1268                                 this->inputs->AddInput(new DoubleInput(vector_enum,(double)vector[index]));
     1267                        else if (code==7){ //IssmDouble
     1268                                this->inputs->AddInput(new DoubleInput(vector_enum,(IssmDouble)vector[index]));
    12691269                        }
    12701270                        else _error_("%s%i"," could not recognize nature of vector from code ",code);
    12711271                }
     
    12831283void  Penta::InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum){
    12841284
    12851285        int  step,i;
    1286         double  xyz_list[NUMVERTICES][3];
    1287         double  Helem_list[NUMVERTICES];
    1288         double  zeros_list[NUMVERTICES]={0.0};
     1286        IssmDouble  xyz_list[NUMVERTICES][3];
     1287        IssmDouble  Helem_list[NUMVERTICES];
     1288        IssmDouble  zeros_list[NUMVERTICES]={0.0};
    12891289        Penta* penta=NULL;
    12901290        Input* original_input=NULL;
    12911291        Input* element_integrated_input=NULL;
     
    14571457}
    14581458/*}}}*/
    14591459/*FUNCTION Penta::InputScale{{{*/
    1460 void  Penta::InputScale(int enum_type,double scale_factor){
     1460void  Penta::InputScale(int enum_type,IssmDouble scale_factor){
    14611461
    14621462        Input* input=NULL;
    14631463
     
    14701470}
    14711471/*}}}*/
    14721472/*FUNCTION Penta::InputToResult{{{*/
    1473 void  Penta::InputToResult(int enum_type,int step,double time){
     1473void  Penta::InputToResult(int enum_type,int step,IssmDouble time){
    14741474
    14751475        int    i;
    14761476        bool   found = false;
     
    15041504        this->inputs->AddInput(new BoolInput(name,constant));
    15051505}
    15061506/*}}}*/
    1507 /*FUNCTION Penta::InputUpdateFromConstant(double value, int name);{{{*/
    1508 void  Penta::InputUpdateFromConstant(double constant, int name){
     1507/*FUNCTION Penta::InputUpdateFromConstant(IssmDouble value, int name);{{{*/
     1508void  Penta::InputUpdateFromConstant(IssmDouble constant, int name){
    15091509        /*Check that name is an element input*/
    15101510        if (!IsInput(name)) return;
    15111511
     
    15281528        /*Intermediaries*/
    15291529        IssmInt i,j;
    15301530        int     penta_vertex_ids[6];
    1531         double  nodeinputs[6];
    1532         double  cmmininputs[6];
    1533         double  cmmaxinputs[6];
     1531        IssmDouble  nodeinputs[6];
     1532        IssmDouble  cmmininputs[6];
     1533        IssmDouble  cmmaxinputs[6];
    15341534
    1535         double  yts;
     1535        IssmDouble  yts;
    15361536        bool    control_analysis;
    15371537        int     num_control_type;
    15381538        int     num_cm_responses;
     
    16461646}
    16471647/*}}}*/
    16481648/*FUNCTION Penta::InputUpdateFromSolution {{{*/
    1649 void  Penta::InputUpdateFromSolution(double* solution){
     1649void  Penta::InputUpdateFromSolution(IssmDouble* solution){
    16501650
    16511651        int analysis_type;
    16521652
     
    17151715}
    17161716/*}}}*/
    17171717/*FUNCTION Penta::InputUpdateFromSolutionPrognostic{{{*/
    1718 void  Penta::InputUpdateFromSolutionPrognostic(double* solution){
     1718void  Penta::InputUpdateFromSolutionPrognostic(IssmDouble* solution){
    17191719
    17201720        const int  numdof   = NDOF1*NUMVERTICES;
    17211721        const int  numdof2d = NDOF1*NUMVERTICES2D;
    17221722
    17231723        int    i,hydroadjustment;
    17241724        int*   doflist = NULL;
    1725         double rho_ice,rho_water,minthickness;
    1726         double newthickness[numdof];
    1727         double newbed[numdof];
    1728         double newsurface[numdof];
    1729         double oldbed[NUMVERTICES];
    1730         double oldsurface[NUMVERTICES];
    1731         double oldthickness[NUMVERTICES];
     1725        IssmDouble rho_ice,rho_water,minthickness;
     1726        IssmDouble newthickness[numdof];
     1727        IssmDouble newbed[numdof];
     1728        IssmDouble newsurface[numdof];
     1729        IssmDouble oldbed[NUMVERTICES];
     1730        IssmDouble oldsurface[NUMVERTICES];
     1731        IssmDouble oldthickness[NUMVERTICES];
    17321732        Penta  *penta   = NULL;
    17331733
    17341734        /*If not on bed, return*/
     
    17981798}
    17991799/*}}}*/
    18001800/*FUNCTION Penta::InputUpdateFromSolutionOneDof{{{*/
    1801 void  Penta::InputUpdateFromSolutionOneDof(double* solution,int enum_type){
     1801void  Penta::InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type){
    18021802
    18031803        const int numdof = NDOF1*NUMVERTICES;
    18041804
    1805         double values[numdof];
     1805        IssmDouble values[numdof];
    18061806        int*   doflist=NULL;
    18071807
    18081808        /*Get dof list: */
     
    18221822}
    18231823/*}}}*/
    18241824/*FUNCTION Penta::InputUpdateFromSolutionOneDofCollpased{{{*/
    1825 void  Penta::InputUpdateFromSolutionOneDofCollapsed(double* solution,int enum_type){
     1825void  Penta::InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int enum_type){
    18261826
    18271827        const int  numdof   = NDOF1*NUMVERTICES;
    18281828        const int  numdof2d = NDOF1*NUMVERTICES2D;
    18291829
    1830         double  values[numdof];
     1830        IssmDouble  values[numdof];
    18311831        int*    doflist = NULL;
    18321832        Penta  *penta   = NULL;
    18331833
     
    18611861        xDelete<int>(doflist);
    18621862}
    18631863/*}}}*/
    1864 /*FUNCTION Penta::InputUpdateFromVector(double* vector, int name, int type);{{{*/
    1865 void  Penta::InputUpdateFromVector(double* vector, int name, int type){
     1864/*FUNCTION Penta::InputUpdateFromVector(IssmDouble* vector, int name, int type);{{{*/
     1865void  Penta::InputUpdateFromVector(IssmDouble* vector, int name, int type){
    18661866
    18671867        /*Check that name is an element input*/
    18681868        if (!IsInput(name)) return;
     
    18741874                case VertexEnum:
    18751875
    18761876                        /*New PentaVertexInpu*/
    1877                         double values[6];
     1877                        IssmDouble values[6];
    18781878
    18791879                        /*Get values on the 6 vertices*/
    18801880                        for (int i=0;i<6;i++){
     
    19771977}
    19781978/*}}}*/
    19791979/*FUNCTION Penta::IsNodeOnShelfFromFlags {{{*/
    1980 bool   Penta::IsNodeOnShelfFromFlags(double* flags){
     1980bool   Penta::IsNodeOnShelfFromFlags(IssmDouble* flags){
    19811981
    19821982        int  i;
    19831983        bool shelf=false;
     
    20082008}
    20092009/*}}}*/
    20102010/*FUNCTION Penta::ListResultsInfo{{{*/
    2011 void Penta::ListResultsInfo(int** in_resultsenums,int** in_resultssizes,double** in_resultstimes,int** in_resultssteps,int* in_num_results){
     2011void Penta::ListResultsInfo(int** in_resultsenums,int** in_resultssizes,IssmDouble** in_resultstimes,int** in_resultssteps,int* in_num_results){
    20122012
    20132013        /*Intermediaries*/
    20142014        int     i;
    20152015        int     numberofresults = 0;
    20162016        int     *resultsenums   = NULL;
    20172017        int     *resultssizes   = NULL;
    2018         double  *resultstimes   = NULL;
     2018        IssmDouble  *resultstimes   = NULL;
    20192019        int     *resultssteps   = NULL;
    20202020
    20212021        /*Checks*/
     
    20322032                /*Allocate output*/
    20332033                resultsenums=xNew<int>(numberofresults);
    20342034                resultssizes=xNew<int>(numberofresults);
    2035                 resultstimes=xNew<double>(numberofresults);
     2035                resultstimes=xNew<IssmDouble>(numberofresults);
    20362036                resultssteps=xNew<int>(numberofresults);
    20372037
    20382038                /*populate enums*/
     
    20592059
    20602060}/*}}}*/
    20612061/*FUNCTION Penta::MigrateGroundingLine{{{*/
    2062 void  Penta::MigrateGroundingLine(double* old_floating_ice,double* sheet_ungrounding){
     2062void  Penta::MigrateGroundingLine(IssmDouble* old_floating_ice,IssmDouble* sheet_ungrounding){
    20632063
    20642064        int     i,migration_style,unground;
    20652065        bool    elementonshelf = false;
    2066         double  bed_hydro,yts,gl_melting_rate;
    2067         double  rho_water,rho_ice,density;
    2068         double  melting[NUMVERTICES];
    2069         double  h[NUMVERTICES],s[NUMVERTICES],b[NUMVERTICES],ba[NUMVERTICES];
     2066        IssmDouble  bed_hydro,yts,gl_melting_rate;
     2067        IssmDouble  rho_water,rho_ice,density;
     2068        IssmDouble  melting[NUMVERTICES];
     2069        IssmDouble  h[NUMVERTICES],s[NUMVERTICES],b[NUMVERTICES],ba[NUMVERTICES];
    20702070
    20712071        if(!IsOnBed()) return;
    20722072
     
    21422142}
    21432143/*}}}*/
    21442144/*FUNCTION Penta::MinEdgeLength{{{*/
    2145 double Penta::MinEdgeLength(double xyz_list[6][3]){
     2145IssmDouble Penta::MinEdgeLength(IssmDouble xyz_list[6][3]){
    21462146        /*Return the minimum lenght of the nine egdes of the penta*/
    21472147
    21482148        int    i,node0,node1;
    21492149        int    edges[9][2]={{0,1},{0,2},{1,2},{3,4},{3,5},{4,5},{0,3},{1,4},{2,5}}; //list of the nine edges
    2150         double length;
    2151         double minlength=-1;
     2150        IssmDouble length;
     2151        IssmDouble minlength=-1;
    21522152
    21532153        for(i=0;i<9;i++){
    21542154                /*Find the two nodes for this edge*/
     
    21702170}
    21712171/*}}}*/
    21722172/*FUNCTION Penta::NodalValue {{{*/
    2173 int    Penta::NodalValue(double* pvalue, int index, int natureofdataenum,bool process_units){
     2173int    Penta::NodalValue(IssmDouble* pvalue, int index, int natureofdataenum,bool process_units){
    21742174
    21752175        int i;
    21762176        int found=0;
    2177         double value;
     2177        IssmDouble value;
    21782178        Input* data=NULL;
    21792179        GaussPenta* gauss=NULL;
    21802180
     
    22522252}
    22532253/*}}}*/
    22542254/*FUNCTION Penta::PositiveDegreeDay{{{*/
    2255 void  Penta::PositiveDegreeDay(double* pdds,double* pds,double signorm){
     2255void  Penta::PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){
    22562256
    22572257
    22582258   int    i,iqj,imonth;
    2259    double agd[NUMVERTICES];  // surface and basal
    2260    double saccu[NUMVERTICES] = {0};     // yearly surface accumulation
    2261    double smelt[NUMVERTICES] = {0};     // yearly melt
    2262    double precrunoff[NUMVERTICES];      // yearly runoff
    2263    double prect; // total precipitation during 1 year taking into account des. ef.
    2264    double water; //water=rain + snowmelt
    2265    double runoff; //meltwater only, does not include rain
    2266    double sconv; //rhow_rain/rhoi / 12 months
     2259   IssmDouble agd[NUMVERTICES];  // surface and basal
     2260   IssmDouble saccu[NUMVERTICES] = {0};     // yearly surface accumulation
     2261   IssmDouble smelt[NUMVERTICES] = {0};     // yearly melt
     2262   IssmDouble precrunoff[NUMVERTICES];      // yearly runoff
     2263   IssmDouble prect; // total precipitation during 1 year taking into account des. ef.
     2264   IssmDouble water; //water=rain + snowmelt
     2265   IssmDouble runoff; //meltwater only, does not include rain
     2266   IssmDouble sconv; //rhow_rain/rhoi / 12 months
    22672267
    2268    double  rho_water,rho_ice,density;
    2269    double lapser=6.5/1000, sealev=0;    // lapse rate. degrees per meter.
    2270    double desfac = 0.5;                 //desert elevation factor
    2271    double s0p[NUMVERTICES]={0};         //should be set to elevation from precip source
    2272    double s0t[NUMVERTICES]={0};         //should be set to elevation from temperature source
    2273    double st;             // elevation between altitude of the temp record and current altitude
    2274    double sp;             // elevation between altitude of the prec record and current altitude
     2268   IssmDouble  rho_water,rho_ice,density;
     2269   IssmDouble lapser=6.5/1000, sealev=0;    // lapse rate. degrees per meter.
     2270   IssmDouble desfac = 0.5;                 //desert elevation factor
     2271   IssmDouble s0p[NUMVERTICES]={0};         //should be set to elevation from precip source
     2272   IssmDouble s0t[NUMVERTICES]={0};         //should be set to elevation from temperature source
     2273   IssmDouble st;             // elevation between altitude of the temp record and current altitude
     2274   IssmDouble sp;             // elevation between altitude of the prec record and current altitude
    22752275
    22762276
    22772277   // PDD and PD constants and variables
    2278    double siglim;          // sigma limit for the integration which is equal to 2.5 sigmanorm
    2279    double signormc = signorm - 0.5;     // sigma of the temperature distribution for cloudy day
    2280    double siglimc, siglim0, siglim0c;
    2281    double PDup, pddsig, PDCUT = 2.0; // PDcut: rain/snow cutoff temperature (C)
    2282    double DT = 0.02;
    2283    double pddt, pd; // pd: snow/precip fraction, precipitation falling as snow
     2278   IssmDouble siglim;          // sigma limit for the integration which is equal to 2.5 sigmanorm
     2279   IssmDouble signormc = signorm - 0.5;     // sigma of the temperature distribution for cloudy day
     2280   IssmDouble siglimc, siglim0, siglim0c;
     2281   IssmDouble PDup, pddsig, PDCUT = 2.0; // PDcut: rain/snow cutoff temperature (C)
     2282   IssmDouble DT = 0.02;
     2283   IssmDouble pddt, pd; // pd: snow/precip fraction, precipitation falling as snow
    22842284   
    2285    double q, qmpt; // q is desert/elev. fact, hnpfac is huybrect fact, and pd is normal dist.
    2286    double qm[NUMVERTICES] = {0};        // snow part of the precipitation
    2287    double qmt[NUMVERTICES] = {0};       // precipitation without desertification effect adjustment
    2288    double qmp[NUMVERTICES] = {0};       // desertification taken into account
    2289    double pdd[NUMVERTICES] = {0};     
    2290    double frzndd[NUMVERTICES] = {0}; 
     2285   IssmDouble q, qmpt; // q is desert/elev. fact, hnpfac is huybrect fact, and pd is normal dist.
     2286   IssmDouble qm[NUMVERTICES] = {0};        // snow part of the precipitation
     2287   IssmDouble qmt[NUMVERTICES] = {0};       // precipitation without desertification effect adjustment
     2288   IssmDouble qmp[NUMVERTICES] = {0};       // desertification taken into account
     2289   IssmDouble pdd[NUMVERTICES] = {0};     
     2290   IssmDouble frzndd[NUMVERTICES] = {0}; 
    22912291
    2292    double tstar;                        // monthly mean surface temp
    2293    double Tsum[NUMVERTICES]= {0};       // average summer (JJA) temperature
    2294    double Tsurf[NUMVERTICES] = {0};     // average annual temperature   
     2292   IssmDouble tstar;                        // monthly mean surface temp
     2293   IssmDouble Tsum[NUMVERTICES]= {0};       // average summer (JJA) temperature
     2294   IssmDouble Tsurf[NUMVERTICES] = {0};     // average annual temperature   
    22952295   
    2296    double h[NUMVERTICES],s[NUMVERTICES],ttmp[NUMVERTICES],prectmp[NUMVERTICES]; // ,b[NUMVERTICES]
    2297    double t[NUMVERTICES][12],prec[NUMVERTICES][12];
    2298    double deltm=1/12;
     2296   IssmDouble h[NUMVERTICES],s[NUMVERTICES],ttmp[NUMVERTICES],prectmp[NUMVERTICES]; // ,b[NUMVERTICES]
     2297   IssmDouble t[NUMVERTICES][12],prec[NUMVERTICES][12];
     2298   IssmDouble deltm=1/12;
    22992299   int    ismon[12]={12,1,2,3,4,5,6,7,8,9,10,11};
    23002300
    2301    double snwm;  // snow that could have been melted in a year.
    2302    double snwmf; //  ablation factor for snow per positive degree day.
    2303    double smf;   //  ablation factor for ice per pdd (Braithwaite 1995 from tarasov 2002).
     2301   IssmDouble snwm;  // snow that could have been melted in a year.
     2302   IssmDouble snwmf; //  ablation factor for snow per positive degree day.
     2303   IssmDouble smf;   //  ablation factor for ice per pdd (Braithwaite 1995 from tarasov 2002).
    23042304
    2305    double dfrz=1.5, CovrLm=2009./3.35e+5, dCovrLm=dfrz*CovrLm; //m*J kg^-1 C^-1 /(J kg^-1)=m/C yr
    2306    double supice,supcap,diffndd;
    2307    double fsupT=0.5,  fsupndd=0.5;  // Tsurf mode factors for supice
    2308    double pddtj[NUMVERTICES], hmx2;
     2305   IssmDouble dfrz=1.5, CovrLm=2009./3.35e+5, dCovrLm=dfrz*CovrLm; //m*J kg^-1 C^-1 /(J kg^-1)=m/C yr
     2306   IssmDouble supice,supcap,diffndd;
     2307   IssmDouble fsupT=0.5,  fsupndd=0.5;  // Tsurf mode factors for supice
     2308   IssmDouble pddtj[NUMVERTICES], hmx2;
    23092309
    23102310   /*Recover info at the vertices: */
    23112311   GetInputListOnVertices(&h[0],ThicknessEnum);
     
    24802480void  Penta::PotentialSheetUngrounding(Vector* potential_sheet_ungrounding){
    24812481
    24822482        int     i;
    2483         double  h[NUMVERTICES],ba[NUMVERTICES];
    2484         double  bed_hydro;
    2485         double  rho_water,rho_ice,density;
     2483        IssmDouble  h[NUMVERTICES],ba[NUMVERTICES];
     2484        IssmDouble  bed_hydro;
     2485        IssmDouble  rho_water,rho_ice,density;
    24862486        bool    elementonshelf = false;
    24872487
    24882488        /*material parameters: */
     
    25172517}
    25182518/*}}}*/
    25192519/*FUNCTION Penta::ReduceMatrixStokes {{{*/
    2520 void Penta::ReduceMatrixStokes(double* Ke_reduced, double* Ke_temp){
     2520void Penta::ReduceMatrixStokes(IssmDouble* Ke_reduced, IssmDouble* Ke_temp){
    25212521
    25222522        int    i,j;
    2523         double Kii[24][24];
    2524         double Kib[24][3];
    2525         double Kbb[3][3];
    2526         double Kbi[3][24];
    2527         double Kbbinv[3][3];
    2528         double Kright[24][24];
     2523        IssmDouble Kii[24][24];
     2524        IssmDouble Kib[24][3];
     2525        IssmDouble Kbb[3][3];
     2526        IssmDouble Kbi[3][24];
     2527        IssmDouble Kbbinv[3][3];
     2528        IssmDouble Kright[24][24];
    25292529
    25302530        /*Create the four matrices used for reduction */
    25312531        for(i=0;i<24;i++){
     
    25592559}
    25602560/*}}}*/
    25612561/*FUNCTION Penta::ReduceVectorStokes {{{*/
    2562 void Penta::ReduceVectorStokes(double* Pe_reduced, double* Ke_temp, double* Pe_temp){
     2562void Penta::ReduceVectorStokes(IssmDouble* Pe_reduced, IssmDouble* Ke_temp, IssmDouble* Pe_temp){
    25632563
    25642564        int    i,j;
    2565         double Pi[24];
    2566         double Pb[3];
    2567         double Kbb[3][3];
    2568         double Kib[24][3];
    2569         double Kbbinv[3][3];
    2570         double Pright[24];
     2565        IssmDouble Pi[24];
     2566        IssmDouble Pb[3];
     2567        IssmDouble Kbb[3][3];
     2568        IssmDouble Kib[24][3];
     2569        IssmDouble Kbbinv[3][3];
     2570        IssmDouble Pright[24];
    25712571
    25722572        /*Create the four matrices used for reduction */
    25732573        for(i=0;i<24;i++) Pi[i]=*(Pe_temp+i);
     
    25942594}
    25952595/*}}}*/
    25962596/*FUNCTION Penta::RequestedOutput{{{*/
    2597 void Penta::RequestedOutput(int output_enum,int step,double time){
     2597void Penta::RequestedOutput(int output_enum,int step,IssmDouble time){
    25982598                       
    25992599        if(IsInput(output_enum)){
    26002600                /*just transfer this input to results, and we are done: */
     
    26482648void  Penta::ResetCoordinateSystem(void){
    26492649
    26502650        int    approximation;
    2651         double slopex[NUMVERTICES];
    2652         double slopey[NUMVERTICES];
    2653         double xz_plane[6];
     2651        IssmDouble slopex[NUMVERTICES];
     2652        IssmDouble slopey[NUMVERTICES];
     2653        IssmDouble xz_plane[6];
    26542654
    26552655        /*For Stokes only: we want the CS to be tangential to the bedrock*/
    26562656        inputs->GetInputValue(&approximation,ApproximationEnum);
     
    27382738}
    27392739/*}}}*/
    27402740/*FUNCTION Penta::SurfaceArea {{{*/
    2741 double Penta::SurfaceArea(void){
     2741IssmDouble Penta::SurfaceArea(void){
    27422742
    27432743        int    approximation;
    2744         double S;
     2744        IssmDouble S;
    27452745        Tria*  tria=NULL;
    27462746
    27472747        /*retrieve inputs :*/
     
    27752775}
    27762776/*}}}*/
    27772777/*FUNCTION Penta::SurfaceNormal {{{*/
    2778 void Penta::SurfaceNormal(double* surface_normal, double xyz_list[3][3]){
     2778void Penta::SurfaceNormal(IssmDouble* surface_normal, IssmDouble xyz_list[3][3]){
    27792779
    27802780        int    i;
    2781         double v13[3],v23[3];
    2782         double normal[3];
    2783         double normal_norm;
     2781        IssmDouble v13[3],v23[3];
     2782        IssmDouble normal[3];
     2783        IssmDouble normal_norm;
    27842784
    27852785        for (i=0;i<3;i++){
    27862786                v13[i]=xyz_list[0][i]-xyz_list[2][i];
     
    27992799}
    28002800/*}}}*/
    28012801/*FUNCTION Penta::TimeAdapt{{{*/
    2802 double  Penta::TimeAdapt(void){
     2802IssmDouble  Penta::TimeAdapt(void){
    28032803
    28042804        int    i;
    2805         double C,dx,dy,dz,dt;
    2806         double maxabsvx,maxabsvy,maxabsvz;
    2807         double maxx,minx,maxy,miny,maxz,minz;
    2808         double xyz_list[NUMVERTICES][3];
     2805        IssmDouble C,dx,dy,dz,dt;
     2806        IssmDouble maxabsvx,maxabsvy,maxabsvz;
     2807        IssmDouble maxx,minx,maxy,miny,maxz,minz;
     2808        IssmDouble xyz_list[NUMVERTICES][3];
    28092809
    28102810        /*get CFL coefficient:*/
    28112811        this->parameters->FindParam(&C,TimesteppingCflCoefficientEnum);
     
    28502850        int     penta_type;
    28512851        int     penta_node_ids[6];
    28522852        int     penta_vertex_ids[6];
    2853         double  nodeinputs[6];
    2854         double  yts;
     2853        IssmDouble  nodeinputs[6];
     2854        IssmDouble  yts;
    28552855        int     stabilization;
    28562856        bool    dakota_analysis;
    28572857        bool    isstokes;
    2858         double  beta,heatcapacity,referencetemperature,meltingpoint,latentheat;
     2858        IssmDouble  beta,heatcapacity,referencetemperature,meltingpoint,latentheat;
    28592859
    28602860        /*Fetch parameters: */
    28612861        iomodel->Constant(&yts,ConstantsYtsEnum);
     
    29972997}
    29982998/*}}}*/
    29992999/*FUNCTION Penta::UpdatePotentialSheetUngrounding{{{*/
    3000 int Penta::UpdatePotentialSheetUngrounding(double* vertices_potentially_ungrounding,Vector* vec_nodes_on_iceshelf,double* nodes_on_iceshelf){
     3000int Penta::UpdatePotentialSheetUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){
    30013001
    30023002        int i;
    30033003        int nflipped=0;
     
    30243024
    30253025        /*Intermediaries*/
    30263026        int    iv;
    3027         double phi;
    3028         double viscosity;
    3029         double xyz_list[NUMVERTICES][3];
    3030         double epsilon[6];
    3031         double     viscousheating[NUMVERTICES]={0,0,0,0,0,0};
    3032         double     thickness;
     3027        IssmDouble phi;
     3028        IssmDouble viscosity;
     3029        IssmDouble xyz_list[NUMVERTICES][3];
     3030        IssmDouble epsilon[6];
     3031        IssmDouble     viscousheating[NUMVERTICES]={0,0,0,0,0,0};
     3032        IssmDouble     thickness;
    30333033        GaussPenta *gauss=NULL;
    30343034
    30353035        /*Initialize Element vector*/
     
    30653065}
    30663066/*}}}*/
    30673067/*FUNCTION Penta::SmearFunction {{{*/
    3068 void  Penta::SmearFunction(Vector* smearedvector,double (*WeightFunction)(double distance,double radius),double radius){
     3068void  Penta::SmearFunction(Vector* smearedvector,IssmDouble (*WeightFunction)(IssmDouble distance,IssmDouble radius),IssmDouble radius){
    30693069        _error_("not implemented yet");
    30703070}
    30713071/*}}}*/
    30723072
    30733073#ifdef _HAVE_RESPONSES_
    30743074/*FUNCTION Penta::IceVolume {{{*/
    3075 double Penta::IceVolume(void){
     3075IssmDouble Penta::IceVolume(void){
    30763076
    30773077        /*The volume of a troncated prism is base * 1/3 sum(length of edges)*/
    3078         double base,height;
    3079         double xyz_list[NUMVERTICES][3];
     3078        IssmDouble base,height;
     3079        IssmDouble xyz_list[NUMVERTICES][3];
    30803080
    30813081        if(IsOnWater())return 0;
    30823082
     
    30953095}
    30963096/*}}}*/
    30973097/*FUNCTION Penta::MinVel{{{*/
    3098 void  Penta::MinVel(double* pminvel, bool process_units){
     3098void  Penta::MinVel(IssmDouble* pminvel, bool process_units){
    30993099
    31003100        /*Get minimum:*/
    3101         double minvel=this->inputs->Min(VelEnum);
     3101        IssmDouble minvel=this->inputs->Min(VelEnum);
    31023102
    31033103        /*process units if requested: */
    31043104        if(process_units) minvel=UnitConversion(minvel,IuToExtEnum,VelEnum);
     
    31083108}
    31093109/*}}}*/
    31103110/*FUNCTION Penta::MinVx{{{*/
    3111 void  Penta::MinVx(double* pminvx, bool process_units){
     3111void  Penta::MinVx(IssmDouble* pminvx, bool process_units){
    31123112
    31133113        /*Get minimum:*/
    3114         double minvx=this->inputs->Min(VxEnum);
     3114        IssmDouble minvx=this->inputs->Min(VxEnum);
    31153115
    31163116        /*process units if requested: */
    31173117        if(process_units) minvx=UnitConversion(minvx,IuToExtEnum,VxEnum);
     
    31213121}
    31223122/*}}}*/
    31233123/*FUNCTION Penta::MinVy{{{*/
    3124 void  Penta::MinVy(double* pminvy, bool process_units){
     3124void  Penta::MinVy(IssmDouble* pminvy, bool process_units){
    31253125
    31263126        /*Get minimum:*/
    3127         double minvy=this->inputs->Min(VyEnum);
     3127        IssmDouble minvy=this->inputs->Min(VyEnum);
    31283128
    31293129        /*process units if requested: */
    31303130        if(process_units) minvy=UnitConversion(minvy,IuToExtEnum,VyEnum);
     
    31343134}
    31353135/*}}}*/
    31363136/*FUNCTION Penta::MinVz{{{*/
    3137 void  Penta::MinVz(double* pminvz, bool process_units){
     3137void  Penta::MinVz(IssmDouble* pminvz, bool process_units){
    31383138
    31393139        /*Get minimum:*/
    3140         double minvz=this->inputs->Min(VzEnum);
     3140        IssmDouble minvz=this->inputs->Min(VzEnum);
    31413141
    31423142        /*process units if requested: */
    31433143        if(process_units) minvz=UnitConversion(minvz,IuToExtEnum,VzEnum);
     
    31473147}
    31483148/*}}}*/
    31493149/*FUNCTION Penta::MassFlux {{{*/
    3150 double Penta::MassFlux( double* segment,bool process_units){
     3150IssmDouble Penta::MassFlux( IssmDouble* segment,bool process_units){
    31513151
    3152         double mass_flux=0;
     3152        IssmDouble mass_flux=0;
    31533153
    31543154        if(!IsOnBed()) return mass_flux;
    31553155
     
    31713171}
    31723172/*}}}*/
    31733173/*FUNCTION Penta::MaxAbsVx{{{*/
    3174 void  Penta::MaxAbsVx(double* pmaxabsvx, bool process_units){
     3174void  Penta::MaxAbsVx(IssmDouble* pmaxabsvx, bool process_units){
    31753175
    31763176        /*Get maximum:*/
    3177         double maxabsvx=this->inputs->MaxAbs(VxEnum);
     3177        IssmDouble maxabsvx=this->inputs->MaxAbs(VxEnum);
    31783178
    31793179        /*process units if requested: */
    31803180        if(process_units) maxabsvx=UnitConversion(maxabsvx,IuToExtEnum,VxEnum);
     
    31843184}
    31853185/*}}}*/
    31863186/*FUNCTION Penta::MaxAbsVy{{{*/
    3187 void  Penta::MaxAbsVy(double* pmaxabsvy, bool process_units){
     3187void  Penta::MaxAbsVy(IssmDouble* pmaxabsvy, bool process_units){
    31883188
    31893189        /*Get maximum:*/
    3190         double maxabsvy=this->inputs->MaxAbs(VyEnum);
     3190        IssmDouble maxabsvy=this->inputs->MaxAbs(VyEnum);
    31913191
    31923192        /*process units if requested: */
    31933193        if(process_units) maxabsvy=UnitConversion(maxabsvy,IuToExtEnum,VyEnum);
     
    31973197}
    31983198/*}}}*/
    31993199/*FUNCTION Penta::MaxAbsVz{{{*/
    3200 void  Penta::MaxAbsVz(double* pmaxabsvz, bool process_units){
     3200void  Penta::MaxAbsVz(IssmDouble* pmaxabsvz, bool process_units){
    32013201
    32023202        /*Get maximum:*/
    3203         double maxabsvz=this->inputs->MaxAbs(VzEnum);
     3203        IssmDouble maxabsvz=this->inputs->MaxAbs(VzEnum);
    32043204
    32053205        /*process units if requested: */
    32063206        if(process_units) maxabsvz=UnitConversion(maxabsvz,IuToExtEnum,VyEnum);
     
    32103210}
    32113211/*}}}*/
    32123212/*FUNCTION Penta::MaxVel{{{*/
    3213 void  Penta::MaxVel(double* pmaxvel, bool process_units){
     3213void  Penta::MaxVel(IssmDouble* pmaxvel, bool process_units){
    32143214
    32153215        /*Get maximum:*/
    3216         double maxvel=this->inputs->Max(VelEnum);
     3216        IssmDouble maxvel=this->inputs->Max(VelEnum);
    32173217
    32183218        /*process units if requested: */
    32193219        if(process_units) maxvel=UnitConversion(maxvel,IuToExtEnum,VelEnum);
     
    32243224}
    32253225/*}}}*/
    32263226/*FUNCTION Penta::MaxVx{{{*/
    3227 void  Penta::MaxVx(double* pmaxvx, bool process_units){
     3227void  Penta::MaxVx(IssmDouble* pmaxvx, bool process_units){
    32283228
    32293229        /*Get maximum:*/
    3230         double maxvx=this->inputs->Max(VxEnum);
     3230        IssmDouble maxvx=this->inputs->Max(VxEnum);
    32313231
    32323232        /*process units if requested: */
    32333233        if(process_units) maxvx=UnitConversion(maxvx,IuToExtEnum,VxEnum);
     
    32373237}
    32383238/*}}}*/
    32393239/*FUNCTION Penta::MaxVy{{{*/
    3240 void  Penta::MaxVy(double* pmaxvy, bool process_units){
     3240void  Penta::MaxVy(IssmDouble* pmaxvy, bool process_units){
    32413241
    32423242        /*Get maximum:*/
    3243         double maxvy=this->inputs->Max(VyEnum);
     3243        IssmDouble maxvy=this->inputs->Max(VyEnum);
    32443244
    32453245        /*process units if requested: */
    32463246        if(process_units) maxvy=UnitConversion(maxvy,IuToExtEnum,VyEnum);
     
    32503250}
    32513251/*}}}*/
    32523252/*FUNCTION Penta::MaxVz{{{*/
    3253 void  Penta::MaxVz(double* pmaxvz, bool process_units){
     3253void  Penta::MaxVz(IssmDouble* pmaxvz, bool process_units){
    32543254
    32553255        /*Get maximum:*/
    3256         double maxvz=this->inputs->Max(VzEnum);
     3256        IssmDouble maxvz=this->inputs->Max(VzEnum);
    32573257
    32583258        /*process units if requested: */
    32593259        if(process_units) maxvz=UnitConversion(maxvz,IuToExtEnum,VzEnum);
     
    32633263}
    32643264/*}}}*/
    32653265/*FUNCTION Penta::ElementResponse{{{*/
    3266 void Penta::ElementResponse(double* presponse,int response_enum,bool process_units){
     3266void Penta::ElementResponse(IssmDouble* presponse,int response_enum,bool process_units){
    32673267
    32683268        switch(response_enum){
    32693269                case MaterialsRheologyBbarEnum:
     
    32723272                case VelEnum:
    32733273
    32743274                        /*Get input:*/
    3275                         double vel;
     3275                        IssmDouble vel;
    32763276                        Input* vel_input;
    32773277
    32783278                        vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input);
     
    33153315        /*Intermediaries */
    33163316        int        stabilization;
    33173317        int        i,j,ig,found=0;
    3318         double     Jdet,u,v,w,um,vm,wm;
    3319         double     h,hx,hy,hz,vx,vy,vz,vel;
    3320         double     gravity,rho_ice,rho_water;
    3321         double     epsvel=2.220446049250313e-16;
    3322         double     heatcapacity,thermalconductivity,dt;
    3323         double     pressure,enthalpy;
    3324         double     latentheat,kappa;
    3325         double     tau_parameter,diameter;
    3326         double     xyz_list[NUMVERTICES][3];
    3327         double     B_conduct[3][numdof];
    3328         double     B_advec[3][numdof];
    3329         double     Bprime_advec[3][numdof];
    3330         double     L[numdof];
    3331         double     dbasis[3][6];
    3332         double     D_scalar_conduct,D_scalar_advec;
    3333         double     D_scalar_trans,D_scalar_stab;
    3334         double     D[3][3];
    3335         double     K[3][3]={0.0};
     3318        IssmDouble     Jdet,u,v,w,um,vm,wm;
     3319        IssmDouble     h,hx,hy,hz,vx,vy,vz,vel;
     3320        IssmDouble     gravity,rho_ice,rho_water;
     3321        IssmDouble     epsvel=2.220446049250313e-16;
     3322        IssmDouble     heatcapacity,thermalconductivity,dt;
     3323        IssmDouble     pressure,enthalpy;
     3324        IssmDouble     latentheat,kappa;
     3325        IssmDouble     tau_parameter,diameter;
     3326        IssmDouble     xyz_list[NUMVERTICES][3];
     3327        IssmDouble     B_conduct[3][numdof];
     3328        IssmDouble     B_advec[3][numdof];
     3329        IssmDouble     Bprime_advec[3][numdof];
     3330        IssmDouble     L[numdof];
     3331        IssmDouble     dbasis[3][6];
     3332        IssmDouble     D_scalar_conduct,D_scalar_advec;
     3333        IssmDouble     D_scalar_trans,D_scalar_stab;
     3334        IssmDouble     D[3][3];
     3335        IssmDouble     K[3][3]={0.0};
    33363336        Tria*      tria=NULL;
    33373337        GaussPenta *gauss=NULL;
    33383338
     
    34713471
    34723472        /*Intermediaries */
    34733473        int       i,j,ig;
    3474         double    mixed_layer_capacity,thermal_exchange_velocity;
    3475         double    rho_ice,rho_water,heatcapacity;
    3476         double    Jdet2d,dt;
    3477         double    xyz_list[NUMVERTICES][3];
    3478         double   xyz_list_tria[NUMVERTICES2D][3];
    3479         double    basis[NUMVERTICES];
    3480         double    D_scalar;
     3474        IssmDouble    mixed_layer_capacity,thermal_exchange_velocity;
     3475        IssmDouble    rho_ice,rho_water,heatcapacity;
     3476        IssmDouble    Jdet2d,dt;
     3477        IssmDouble    xyz_list[NUMVERTICES][3];
     3478        IssmDouble       xyz_list_tria[NUMVERTICES2D][3];
     3479        IssmDouble    basis[NUMVERTICES];
     3480        IssmDouble    D_scalar;
    34813481        GaussPenta *gauss=NULL;
    34823482
    34833483        /*Initialize Element matrix and return if necessary*/
     
    35523552        /*Intermediaries */
    35533553        int        stabilization;
    35543554        int        i,j,ig,found=0;
    3555         double     Jdet,u,v,w,um,vm,wm,vel;
    3556         double     h,hx,hy,hz,vx,vy,vz;
    3557         double     gravity,rho_ice,rho_water,kappa;
    3558         double     heatcapacity,thermalconductivity,dt;
    3559         double     tau_parameter,diameter;
    3560         double     xyz_list[NUMVERTICES][3];
    3561         double     B_conduct[3][numdof];
    3562         double     B_advec[3][numdof];
    3563         double     Bprime_advec[3][numdof];
    3564         double     L[numdof];
    3565         double     dbasis[3][6];
    3566         double     D_scalar_conduct,D_scalar_advec;
    3567         double     D_scalar_trans,D_scalar_stab;
    3568         double     D[3][3];
    3569         double     K[3][3]={0.0};
     3555        IssmDouble     Jdet,u,v,w,um,vm,wm,vel;
     3556        IssmDouble     h,hx,hy,hz,vx,vy,vz;
     3557        IssmDouble     gravity,rho_ice,rho_water,kappa;
     3558        IssmDouble     heatcapacity,thermalconductivity,dt;
     3559        IssmDouble     tau_parameter,diameter;
     3560        IssmDouble     xyz_list[NUMVERTICES][3];
     3561        IssmDouble     B_conduct[3][numdof];
     3562        IssmDouble     B_advec[3][numdof];
     3563        IssmDouble     Bprime_advec[3][numdof];
     3564        IssmDouble     L[numdof];
     3565        IssmDouble     dbasis[3][6];
     3566        IssmDouble     D_scalar_conduct,D_scalar_advec;
     3567        IssmDouble     D_scalar_trans,D_scalar_stab;
     3568        IssmDouble     D[3][3];
     3569        IssmDouble     K[3][3]={0.0};
    35703570        Tria*      tria=NULL;
    35713571        GaussPenta *gauss=NULL;
    35723572
     
    37043704
    37053705        /*Intermediaries */
    37063706        int       i,j,ig;
    3707         double    mixed_layer_capacity,thermal_exchange_velocity;
    3708         double    rho_ice,rho_water,heatcapacity;
    3709         double    Jdet2d,dt;
    3710         double    xyz_list[NUMVERTICES][3];
    3711         double   xyz_list_tria[NUMVERTICES2D][3];
    3712         double    basis[NUMVERTICES];
    3713         double    D_scalar;
     3707        IssmDouble    mixed_layer_capacity,thermal_exchange_velocity;
     3708        IssmDouble    rho_ice,rho_water,heatcapacity;
     3709        IssmDouble    Jdet2d,dt;
     3710        IssmDouble    xyz_list[NUMVERTICES][3];
     3711        IssmDouble       xyz_list_tria[NUMVERTICES2D][3];
     3712        IssmDouble    basis[NUMVERTICES];
     3713        IssmDouble    D_scalar;
    37143714        GaussPenta *gauss=NULL;
    37153715
    37163716        /*Initialize Element matrix and return if necessary*/
     
    37753775        /*Intermediaries*/
    37763776        int    i,j,ig,found=0;
    37773777        int    friction_type,stabilization;
    3778         double Jdet,phi,dt;
    3779         double rho_ice,heatcapacity;
    3780         double thermalconductivity,kappa;
    3781         double viscosity,pressure;
    3782         double enthalpy,enthalpypicard;
    3783         double tau_parameter,diameter;
    3784         double u,v,w;
    3785         double scalar_def,scalar_transient;
    3786         double temperature_list[NUMVERTICES];
    3787         double xyz_list[NUMVERTICES][3];
    3788         double L[numdof];
    3789         double dbasis[3][6];
    3790         double epsilon[6];
     3778        IssmDouble Jdet,phi,dt;
     3779        IssmDouble rho_ice,heatcapacity;
     3780        IssmDouble thermalconductivity,kappa;
     3781        IssmDouble viscosity,pressure;
     3782        IssmDouble enthalpy,enthalpypicard;
     3783        IssmDouble tau_parameter,diameter;
     3784        IssmDouble u,v,w;
     3785        IssmDouble scalar_def,scalar_transient;
     3786        IssmDouble temperature_list[NUMVERTICES];
     3787        IssmDouble xyz_list[NUMVERTICES][3];
     3788        IssmDouble L[numdof];
     3789        IssmDouble dbasis[3][6];
     3790        IssmDouble epsilon[6];
    37913791        GaussPenta *gauss=NULL;
    37923792
    37933793        /*Initialize Element vector*/
     
    38703870
    38713871        /*Intermediaries */
    38723872        int        i,j,ig;
    3873         double     Jdet2d;
    3874         double     heatcapacity,h_pmp;
    3875         double     mixed_layer_capacity,thermal_exchange_velocity;
    3876         double     rho_ice,rho_water,pressure,dt,scalar_ocean;
    3877         double     xyz_list[NUMVERTICES][3];
    3878         double     xyz_list_tria[NUMVERTICES2D][3];
    3879         double     basis[NUMVERTICES];
     3873        IssmDouble     Jdet2d;
     3874        IssmDouble     heatcapacity,h_pmp;
     3875        IssmDouble     mixed_layer_capacity,thermal_exchange_velocity;
     3876        IssmDouble     rho_ice,rho_water,pressure,dt,scalar_ocean;
     3877        IssmDouble     xyz_list[NUMVERTICES][3];
     3878        IssmDouble     xyz_list_tria[NUMVERTICES2D][3];
     3879        IssmDouble     basis[NUMVERTICES];
    38803880        GaussPenta* gauss=NULL;
    38813881
    38823882        /* Ice/ocean heat exchange flux on ice shelf base */
     
    39283928        /*Intermediaries */
    39293929        int        i,j,ig;
    39303930        int        analysis_type;
    3931         double     xyz_list[NUMVERTICES][3];
    3932         double     xyz_list_tria[NUMVERTICES2D][3]={0.0};
    3933         double     Jdet2d,dt;
    3934         double     rho_ice,heatcapacity,geothermalflux_value;
    3935         double     basalfriction,alpha2,vx,vy;
    3936         double     scalar,enthalpy,enthalpyup;
    3937         double     pressure,pressureup;
    3938         double     basis[NUMVERTICES];
     3931        IssmDouble     xyz_list[NUMVERTICES][3];
     3932        IssmDouble     xyz_list_tria[NUMVERTICES2D][3]={0.0};
     3933        IssmDouble     Jdet2d,dt;
     3934        IssmDouble     rho_ice,heatcapacity,geothermalflux_value;
     3935        IssmDouble     basalfriction,alpha2,vx,vy;
     3936        IssmDouble     scalar,enthalpy,enthalpyup;
     3937        IssmDouble     pressure,pressureup;
     3938        IssmDouble     basis[NUMVERTICES];
    39393939        Friction*  friction=NULL;
    39403940        GaussPenta* gauss=NULL;
    39413941        GaussPenta* gaussup=NULL;
     
    40384038        /*Intermediaries*/
    40394039        int    i,j,ig,found=0;
    40404040        int    friction_type,stabilization;
    4041         double Jdet,phi,dt;
    4042         double rho_ice,heatcapacity;
    4043         double thermalconductivity,kappa;
    4044         double viscosity,temperature;
    4045         double tau_parameter,diameter;
    4046         double u,v,w;
    4047         double scalar_def,scalar_transient;
    4048         double temperature_list[NUMVERTICES];
    4049         double xyz_list[NUMVERTICES][3];
    4050         double L[numdof];
    4051         double dbasis[3][6];
    4052         double epsilon[6];
     4041        IssmDouble Jdet,phi,dt;
     4042        IssmDouble rho_ice,heatcapacity;
     4043        IssmDouble thermalconductivity,kappa;
     4044        IssmDouble viscosity,temperature;
     4045        IssmDouble tau_parameter,diameter;
     4046        IssmDouble u,v,w;
     4047        IssmDouble scalar_def,scalar_transient;
     4048        IssmDouble temperature_list[NUMVERTICES];
     4049        IssmDouble xyz_list[NUMVERTICES][3];
     4050        IssmDouble L[numdof];
     4051        IssmDouble dbasis[3][6];
     4052        IssmDouble epsilon[6];
    40534053        GaussPenta *gauss=NULL;
    40544054
    40554055        /*Initialize Element vector*/
     
    41244124
    41254125        /*Intermediaries */
    41264126        int        i,j,ig;
    4127         double     Jdet2d;
    4128         double     mixed_layer_capacity,thermal_exchange_velocity;
    4129         double     rho_ice,rho_water,pressure,dt,scalar_ocean;
    4130         double     heatcapacity,t_pmp;
    4131         double     xyz_list[NUMVERTICES][3];
    4132         double     xyz_list_tria[NUMVERTICES2D][3];
    4133         double     basis[NUMVERTICES];
     4127        IssmDouble     Jdet2d;
     4128        IssmDouble     mixed_layer_capacity,thermal_exchange_velocity;
     4129        IssmDouble     rho_ice,rho_water,pressure,dt,scalar_ocean;
     4130        IssmDouble     heatcapacity,t_pmp;
     4131        IssmDouble     xyz_list[NUMVERTICES][3];
     4132        IssmDouble     xyz_list_tria[NUMVERTICES2D][3];
     4133        IssmDouble     basis[NUMVERTICES];
    41344134        GaussPenta* gauss=NULL;
    41354135
    41364136        /* Ice/ocean heat exchange flux on ice shelf base */
     
    41824182        /*Intermediaries */
    41834183        int        i,j,ig;
    41844184        int        analysis_type;
    4185         double     xyz_list[NUMVERTICES][3];
    4186         double     xyz_list_tria[NUMVERTICES2D][3]={0.0};
    4187         double     Jdet2d,dt;
    4188         double     rho_ice,heatcapacity,geothermalflux_value;
    4189         double     basalfriction,alpha2,vx,vy;
    4190         double     basis[NUMVERTICES];
    4191         double     scalar;
     4185        IssmDouble     xyz_list[NUMVERTICES][3];
     4186        IssmDouble     xyz_list_tria[NUMVERTICES2D][3]={0.0};
     4187        IssmDouble     Jdet2d,dt;
     4188        IssmDouble     rho_ice,heatcapacity,geothermalflux_value;
     4189        IssmDouble     basalfriction,alpha2,vx,vy;
     4190        IssmDouble     basis[NUMVERTICES];
     4191        IssmDouble     scalar;
    41924192        Friction*  friction=NULL;
    41934193        GaussPenta* gauss=NULL;
    41944194
     
    42474247
    42484248        int          i;
    42494249        int*         doflist=NULL;
    4250         double       values[numdof];
    4251         double       temp;
     4250        IssmDouble       values[numdof];
     4251        IssmDouble       temp;
    42524252        GaussPenta   *gauss=NULL;
    42534253
    42544254        /*Get dof list: */
     
    42784278
    42794279        int          i;
    42804280        int*         doflist=NULL;
    4281         double       values[numdof];
    4282         double       enthalpy;
     4281        IssmDouble       values[numdof];
     4282        IssmDouble       enthalpy;
    42834283        GaussPenta   *gauss=NULL;
    42844284
    42854285        /*Get dof list: */
     
    43034303}
    43044304/*}}}*/
    43054305/*FUNCTION Penta::InputUpdateFromSolutionThermal {{{*/
    4306 void  Penta::InputUpdateFromSolutionThermal(double* solution){
     4306void  Penta::InputUpdateFromSolutionThermal(IssmDouble* solution){
    43074307
    43084308        const int    numdof=NDOF1*NUMVERTICES;
    43094309
    43104310        bool   converged;
    43114311        int    i,rheology_law;
    4312         double xyz_list[NUMVERTICES][3];
    4313         double values[numdof];
    4314         double B[numdof];
    4315         double B_average,s_average;
     4312        IssmDouble xyz_list[NUMVERTICES][3];
     4313        IssmDouble values[numdof];
     4314        IssmDouble B[numdof];
     4315        IssmDouble B_average,s_average;
    43164316        int*   doflist=NULL;
    4317         //double pressure[numdof];
     4317        //IssmDouble pressure[numdof];
    43184318
    43194319        /*Get dof list: */
    43204320        GetDofList(&doflist,NoneApproximationEnum,GsetEnum);
     
    43744374}
    43754375/*}}}*/
    43764376/*FUNCTION Penta::InputUpdateFromSolutionEnthalpy {{{*/
    4377 void  Penta::InputUpdateFromSolutionEnthalpy(double* solution){
     4377void  Penta::InputUpdateFromSolutionEnthalpy(IssmDouble* solution){
    43784378
    43794379        const int    numdof=NDOF1*NUMVERTICES;
    43804380
    43814381        bool   converged=false;
    43824382        int    i,rheology_law;
    4383         double xyz_list[NUMVERTICES][3];
    4384         double values[numdof];
    4385         double pressure[NUMVERTICES];
    4386         double temperatures[numdof];
    4387         double waterfraction[numdof];
    4388         double B[numdof];
    4389         double B_average,s_average;
     4383        IssmDouble xyz_list[NUMVERTICES][3];
     4384        IssmDouble values[numdof];
     4385        IssmDouble pressure[NUMVERTICES];
     4386        IssmDouble temperatures[numdof];
     4387        IssmDouble waterfraction[numdof];
     4388        IssmDouble B[numdof];
     4389        IssmDouble B_average,s_average;
    43904390        int*   doflist=NULL;
    43914391
    43924392        /*Get dof list: */
     
    44754475
    44764476}/*}}}*/
    44774477/*FUNCTION Penta::ControlInputScaleGradient{{{*/
    4478 void Penta::ControlInputScaleGradient(int enum_type,double scale){
     4478void Penta::ControlInputScaleGradient(int enum_type,IssmDouble scale){
    44794479
    44804480        Input* input=NULL;
    44814481
     
    44914491        ((ControlInput*)input)->ScaleGradient(scale);
    44924492}/*}}}*/
    44934493/*FUNCTION Penta::ControlInputSetGradient{{{*/
    4494 void Penta::ControlInputSetGradient(double* gradient,int enum_type,int control_index){
     4494void Penta::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){
    44954495
    44964496        int    doflist1[NUMVERTICES];
    4497         double grad_list[NUMVERTICES];
     4497        IssmDouble grad_list[NUMVERTICES];
    44984498        Input* grad_input=NULL;
    44994499        Input* input=NULL;
    45004500
     
    45654565        /*Intermediaries */
    45664566        int        i,j,ig;
    45674567        bool       incomplete_adjoint;
    4568         double     xyz_list[NUMVERTICES][3];
    4569         double     Jdet;
    4570         double     eps1dotdphii,eps1dotdphij;
    4571         double     eps2dotdphii,eps2dotdphij;
    4572         double     mu_prime;
    4573         double     epsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
    4574         double     eps1[3],eps2[3];
    4575         double     phi[NUMVERTICES];
    4576         double     dphi[3][NUMVERTICES];
     4568        IssmDouble     xyz_list[NUMVERTICES][3];
     4569        IssmDouble     Jdet;
     4570        IssmDouble     eps1dotdphii,eps1dotdphij;
     4571        IssmDouble     eps2dotdphii,eps2dotdphij;
     4572        IssmDouble     mu_prime;
     4573        IssmDouble     epsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
     4574        IssmDouble     eps1[3],eps2[3];
     4575        IssmDouble     phi[NUMVERTICES];
     4576        IssmDouble     dphi[3][NUMVERTICES];
    45774577        GaussPenta *gauss=NULL;
    45784578
    45794579        /*Initialize Jacobian with regular Pattyn (first part of the Gateau derivative)*/
     
    46334633        /*Intermediaries */
    46344634        int        i,j,ig;
    46354635        bool       incomplete_adjoint;
    4636         double     xyz_list[NUMVERTICES][3];
    4637         double     Jdet;
    4638         double     eps1dotdphii,eps1dotdphij;
    4639         double     eps2dotdphii,eps2dotdphij;
    4640         double     eps3dotdphii,eps3dotdphij;
    4641         double     mu_prime;
    4642         double     epsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
    4643         double     eps1[3],eps2[3],eps3[3];
    4644         double     phi[NUMVERTICES];
    4645         double     dphi[3][NUMVERTICES];
     4636        IssmDouble     xyz_list[NUMVERTICES][3];
     4637        IssmDouble     Jdet;
     4638        IssmDouble     eps1dotdphii,eps1dotdphij;
     4639        IssmDouble     eps2dotdphii,eps2dotdphij;
     4640        IssmDouble     eps3dotdphii,eps3dotdphij;
     4641        IssmDouble     mu_prime;
     4642        IssmDouble     epsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
     4643        IssmDouble     eps1[3],eps2[3],eps3[3];
     4644        IssmDouble     phi[NUMVERTICES];
     4645        IssmDouble     dphi[3][NUMVERTICES];
    46464646        GaussPenta *gauss=NULL;
    46474647
    46484648        /*Initialize Jacobian with regular Stokes (first part of the Gateau derivative)*/
     
    48884888        int        i,j,ig;
    48894889        int        analysis_type;
    48904890        int        doflist1[NUMVERTICES];
    4891         double     vx,vy,lambda,mu,alpha_complement,Jdet;
    4892         double     bed,thickness,Neff,drag;
    4893         double     xyz_list[NUMVERTICES][3];
    4894         double     xyz_list_tria[NUMVERTICES2D][3]={0.0};
    4895         double     dk[NDOF3];
    4896         double     grade_g[NUMVERTICES]={0.0};
    4897         double     grade_g_gaussian[NUMVERTICES];
    4898         double     basis[6];
     4891        IssmDouble     vx,vy,lambda,mu,alpha_complement,Jdet;
     4892        IssmDouble     bed,thickness,Neff,drag;
     4893        IssmDouble     xyz_list[NUMVERTICES][3];
     4894        IssmDouble     xyz_list_tria[NUMVERTICES2D][3]={0.0};
     4895        IssmDouble     dk[NDOF3];
     4896        IssmDouble     grade_g[NUMVERTICES]={0.0};
     4897        IssmDouble     grade_g_gaussian[NUMVERTICES];
     4898        IssmDouble     basis[6];
    48994899        Friction*  friction=NULL;
    49004900        GaussPenta  *gauss=NULL;
    49014901
     
    49594959        int        i,j,ig;
    49604960        int        analysis_type;
    49614961        int        doflist1[NUMVERTICES];
    4962         double     bed,thickness,Neff;
    4963         double     lambda,mu,xi,Jdet,vx,vy,vz;
    4964         double     alpha_complement,drag;
    4965         double     surface_normal[3],bed_normal[3];
    4966         double     xyz_list[NUMVERTICES][3];
    4967         double     xyz_list_tria[NUMVERTICES2D][3]={0.0};
    4968         double     dk[NDOF3];
    4969         double     basis[6];
    4970         double     grade_g[NUMVERTICES]={0.0};
    4971         double     grade_g_gaussian[NUMVERTICES];
     4962        IssmDouble     bed,thickness,Neff;
     4963        IssmDouble     lambda,mu,xi,Jdet,vx,vy,vz;
     4964        IssmDouble     alpha_complement,drag;
     4965        IssmDouble     surface_normal[3],bed_normal[3];
     4966        IssmDouble     xyz_list[NUMVERTICES][3];
     4967        IssmDouble     xyz_list_tria[NUMVERTICES2D][3]={0.0};
     4968        IssmDouble     dk[NDOF3];
     4969        IssmDouble     basis[6];
     4970        IssmDouble     grade_g[NUMVERTICES]={0.0};
     4971        IssmDouble     grade_g_gaussian[NUMVERTICES];
    49724972        Friction*  friction=NULL;
    49734973        GaussPenta* gauss=NULL;
    49744974
     
    50985098        this->matice->inputs->DeleteInput(MaterialsRheologyBbarEnum);
    50995099} /*}}}*/
    51005100/*FUNCTION Penta::InputControlUpdate{{{*/
    5101 void  Penta::InputControlUpdate(double scalar,bool save_parameter){
     5101void  Penta::InputControlUpdate(IssmDouble scalar,bool save_parameter){
    51025102
    51035103        /*Intermediary*/
    51045104        int    num_controls;
     
    51365136}
    51375137/*}}}*/
    51385138/*FUNCTION Penta::InputUpdateFromSolutionAdjointStokes {{{*/
    5139 void  Penta::InputUpdateFromSolutionAdjointStokes(double* solution){
     5139void  Penta::InputUpdateFromSolutionAdjointStokes(IssmDouble* solution){
    51405140
    51415141        const int    numdof=NDOF4*NUMVERTICES;
    51425142
    51435143        int    i;
    5144         double values[numdof];
    5145         double lambdax[NUMVERTICES];
    5146         double lambday[NUMVERTICES];
    5147         double lambdaz[NUMVERTICES];
    5148         double lambdap[NUMVERTICES];
     5144        IssmDouble values[numdof];
     5145        IssmDouble lambdax[NUMVERTICES];
     5146        IssmDouble lambday[NUMVERTICES];
     5147        IssmDouble lambdaz[NUMVERTICES];
     5148        IssmDouble lambdap[NUMVERTICES];
    51495149        int*   doflist=NULL;
    51505150
    51515151        /*Get dof list: */
     
    51795179}
    51805180/*}}}*/
    51815181/*FUNCTION Penta::InputUpdateFromSolutionAdjointHoriz {{{*/
    5182 void  Penta::InputUpdateFromSolutionAdjointHoriz(double* solution){
     5182void  Penta::InputUpdateFromSolutionAdjointHoriz(IssmDouble* solution){
    51835183
    51845184        const int numdof=NDOF2*NUMVERTICES;
    51855185
    51865186        int    i;
    5187         double values[numdof];
    5188         double lambdax[NUMVERTICES];
    5189         double lambday[NUMVERTICES];
     5187        IssmDouble values[numdof];
     5188        IssmDouble lambdax[NUMVERTICES];
     5189        IssmDouble lambday[NUMVERTICES];
    51905190        int*   doflist=NULL;
    51915191
    51925192        /*Get dof list: */
     
    52145214}
    52155215/*}}}*/
    52165216/*FUNCTION Penta::SurfaceAverageVelMisfit {{{*/
    5217 double Penta::SurfaceAverageVelMisfit(bool process_units,int weight_index){
     5217IssmDouble Penta::SurfaceAverageVelMisfit(bool process_units,int weight_index){
    52185218
    52195219        int    approximation;
    5220         double J;
     5220        IssmDouble J;
    52215221        Tria*  tria=NULL;
    52225222
    52235223        /*retrieve inputs :*/
     
    52515251}
    52525252/*}}}*/
    52535253/*FUNCTION Penta::SurfaceAbsVelMisfit {{{*/
    5254 double Penta::SurfaceAbsVelMisfit(bool process_units,int weight_index){
     5254IssmDouble Penta::SurfaceAbsVelMisfit(bool process_units,int weight_index){
    52555255
    52565256        int    approximation;
    5257         double J;
     5257        IssmDouble J;
    52585258        Tria*  tria=NULL;
    52595259
    52605260        /*retrieve inputs :*/
     
    52885288}
    52895289/*}}}*/
    52905290/*FUNCTION Penta::SurfaceLogVelMisfit {{{*/
    5291 double Penta::SurfaceLogVelMisfit(bool process_units,int weight_index){
     5291IssmDouble Penta::SurfaceLogVelMisfit(bool process_units,int weight_index){
    52925292
    52935293        int    approximation;
    5294         double J;
     5294        IssmDouble J;
    52955295        Tria*  tria=NULL;
    52965296
    52975297        /*retrieve inputs :*/
     
    53255325}
    53265326/*}}}*/
    53275327/*FUNCTION Penta::SurfaceLogVxVyMisfit {{{*/
    5328 double Penta::SurfaceLogVxVyMisfit(bool process_units,int weight_index){
     5328IssmDouble Penta::SurfaceLogVxVyMisfit(bool process_units,int weight_index){
    53295329
    5330         double J;
     5330        IssmDouble J;
    53315331        Tria* tria=NULL;
    53325332
    53335333        /*inputs: */
     
    53645364}
    53655365/*}}}*/
    53665366/*FUNCTION Penta::SurfaceRelVelMisfit {{{*/
    5367 double Penta::SurfaceRelVelMisfit(bool process_units,int weight_index){
     5367IssmDouble Penta::SurfaceRelVelMisfit(bool process_units,int weight_index){
    53685368
    53695369        int    approximation;
    5370         double J;
     5370        IssmDouble J;
    53715371        Tria*  tria=NULL;
    53725372
    53735373        /*retrieve inputs :*/
     
    54015401}
    54025402/*}}}*/
    54035403/*FUNCTION Penta::ThicknessAbsGradient{{{*/
    5404 double Penta::ThicknessAbsGradient(bool process_units,int weight_index){
     5404IssmDouble Penta::ThicknessAbsGradient(bool process_units,int weight_index){
    54055405
    54065406        _error_("Not implemented yet");
    54075407}
    54085408/*}}}*/
    54095409/*FUNCTION Penta::ThicknessAbsMisfit {{{*/
    5410 double Penta::ThicknessAbsMisfit(bool process_units,int weight_index){
     5410IssmDouble Penta::ThicknessAbsMisfit(bool process_units,int weight_index){
    54115411
    54125412        int    approximation;
    5413         double J;
     5413        IssmDouble J;
    54145414        Tria*  tria=NULL;
    54155415
    54165416        /*retrieve inputs :*/
     
    54275427}
    54285428/*}}}*/
    54295429/*FUNCTION Penta::DragCoefficientAbsGradient{{{*/
    5430 double Penta::DragCoefficientAbsGradient(bool process_units,int weight_index){
     5430IssmDouble Penta::DragCoefficientAbsGradient(bool process_units,int weight_index){
    54315431
    5432         double J;
     5432        IssmDouble J;
    54335433        Tria*  tria=NULL;
    54345434
    54355435        /*If on water, on shelf or not on bed, skip: */
     
    54425442}
    54435443/*}}}*/
    54445444/*FUNCTION Penta::RheologyBbarAbsGradient{{{*/
    5445 double Penta::RheologyBbarAbsGradient(bool process_units,int weight_index){
     5445IssmDouble Penta::RheologyBbarAbsGradient(bool process_units,int weight_index){
    54465446
    5447         double J;
     5447        IssmDouble J;
    54485448        Tria*  tria=NULL;
    54495449
    54505450        /*If on water, on shelf or not on bed, skip: */
     
    54805480}
    54815481/*}}}*/
    54825482/*FUNCTION Penta::SetControlInputsFromVector{{{*/
    5483 void  Penta::SetControlInputsFromVector(double* vector,int control_enum,int control_index){
     5483void  Penta::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){
    54845484
    5485         double  values[NUMVERTICES];
     5485        IssmDouble  values[NUMVERTICES];
    54865486        int     doflist1[NUMVERTICES];
    54875487        Input  *input     = NULL;
    54885488        Input  *new_input = NULL;
     
    55175517#endif
    55185518
    55195519#ifdef _HAVE_DAKOTA_
    5520 /*FUNCTION Penta::InputUpdateFromVectorDakota(double* vector, int name, int type);{{{*/
    5521 void  Penta::InputUpdateFromVectorDakota(double* vector, int name, int type){
     5520/*FUNCTION Penta::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);{{{*/
     5521void  Penta::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){
    55225522       
    55235523        int i,j;
    55245524
     
    55305530                case VertexEnum:
    55315531
    55325532                        /*New PentaP1Input*/
    5533                         double values[6];
     5533                        IssmDouble values[6];
    55345534
    55355535                        /*Get values on the 6 vertices*/
    55365536                        for (i=0;i<6;i++){
     
    55415541                        switch(name){
    55425542                                case ThicknessEnum:
    55435543                                        /*Update thickness + surface: assume bed is constant. On ice shelves, takes hydrostatic equilibrium {{{*/
    5544                                         double  thickness[6];
    5545                                         double  thickness_init[6];
    5546                                         double  hydrostatic_ratio[6];
    5547                                         double  surface[6];
    5548                                         double  bed[6];
     5544                                        IssmDouble  thickness[6];
     5545                                        IssmDouble  thickness_init[6];
     5546                                        IssmDouble  hydrostatic_ratio[6];
     5547                                        IssmDouble  surface[6];
     5548                                        IssmDouble  bed[6];
    55495549                                       
    55505550                                        /*retrieve inputs: */
    55515551                                        GetInputListOnVertices(&thickness_init[0],ThicknessEnum);
     
    55595559                                        /*build new bed and surface: */
    55605560                                        if (this->IsFloating()){
    55615561                                                /*hydrostatic equilibrium: */
    5562                                                 double rho_ice,rho_water,di;
     5562                                                IssmDouble rho_ice,rho_water,di;
    55635563                                                rho_ice=this->matpar->GetRhoIce();
    55645564                                                rho_water=this->matpar->GetRhoWater();
    55655565
     
    56295629        _error_(" not supported yet!");
    56305630}
    56315631/*}}}*/
    5632 /*FUNCTION Penta::InputUpdateFromMatrixDakota(double* matrix, int nrows, int ncols, int name, int type);{{{*/
    5633 void  Penta::InputUpdateFromMatrixDakota(double* matrix, int nrows, int ncols, int name, int type){
     5632/*FUNCTION Penta::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type);{{{*/
     5633void  Penta::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){
    56345634       
    56355635        int i,j,t;
    56365636        TransientInput* transientinput=NULL;
    5637         double values[6];
    5638         double time;
     5637        IssmDouble values[6];
     5638        IssmDouble time;
    56395639        int row;
    5640         double yts;
     5640        IssmDouble yts;
    56415641
    56425642        /*Check that name is an element input*/
    56435643        if (!IsInput(name)) return;
     
    56555655                                /*create input values: */
    56565656                                for(i=0;i<6;i++){
    56575657                                        row=this->nodes[i]->GetSidList();
    5658                                         values[i]=(double)matrix[ncols*row+t];
     5658                                        values[i]=(IssmDouble)matrix[ncols*row+t];
    56595659                                }
    56605660
    56615661                                /*time? :*/
    5662                                 time=(double)matrix[(nrows-1)*ncols+t]*yts;
     5662                                time=(IssmDouble)matrix[(nrows-1)*ncols+t]*yts;
    56635663
    56645664                                if(t==0) transientinput=new TransientInput(name);
    56655665                                transientinput->AddTimeInput(new PentaP1Input(name,values),time);
     
    57415741
    57425742        /*Intermediaries */
    57435743        int         i,j,ig;
    5744         double      Jdet;
    5745         double      viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity
    5746         double      epsilon[5],oldepsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
    5747         double      xyz_list[NUMVERTICES][3];
    5748         double      B[3][numdofp];
    5749         double      Bprime[3][numdofm];
    5750         double      D[3][3]={0.0};            // material matrix, simple scalar matrix.
    5751         double      D_scalar;
    5752         double      Ke_gg[numdofp][numdofm]={0.0}; //local element stiffness matrix
    5753         double      Ke_gg_gaussian[numdofp][numdofm]; //stiffness matrix evaluated at the gaussian point.
     5744        IssmDouble      Jdet;
     5745        IssmDouble      viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity
     5746        IssmDouble      epsilon[5],oldepsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
     5747        IssmDouble      xyz_list[NUMVERTICES][3];
     5748        IssmDouble      B[3][numdofp];
     5749        IssmDouble      Bprime[3][numdofm];
     5750        IssmDouble      D[3][3]={0.0};            // material matrix, simple scalar matrix.
     5751        IssmDouble      D_scalar;
     5752        IssmDouble      Ke_gg[numdofp][numdofm]={0.0}; //local element stiffness matrix
     5753        IssmDouble      Ke_gg_gaussian[numdofp][numdofm]; //stiffness matrix evaluated at the gaussian point.
    57545754        GaussPenta *gauss=NULL;
    57555755        GaussTria  *gauss_tria=NULL;
    57565756        Node       *node_list[numnodes];
     
    58335833       
    58345834        /*Intermediaries */
    58355835        int       i,j,ig,analysis_type;
    5836         double    Jdet2d,slope_magnitude,alpha2;
    5837         double    xyz_list[NUMVERTICES][3];
    5838         double    xyz_list_tria[NUMVERTICES2D][3]={0.0};
    5839         double    slope[3]={0.0,0.0,0.0};
    5840         double    MAXSLOPE=.06; // 6 %
    5841         double    MOUNTAINKEXPONENT=10;
    5842         double    L[2][numdof];
    5843         double    DL[2][2]                  ={{ 0,0 },{0,0}}; //for basal drag
    5844         double    DL_scalar;
    5845         double    Ke_gg[numdof][numdof]     ={0.0};
    5846         double    Ke_gg_gaussian[numdof][numdof]; //stiffness matrix contribution from drag
     5836        IssmDouble    Jdet2d,slope_magnitude,alpha2;
     5837        IssmDouble    xyz_list[NUMVERTICES][3];
     5838        IssmDouble    xyz_list_tria[NUMVERTICES2D][3]={0.0};
     5839        IssmDouble    slope[3]={0.0,0.0,0.0};
     5840        IssmDouble    MAXSLOPE=.06; // 6 %
     5841        IssmDouble    MOUNTAINKEXPONENT=10;
     5842        IssmDouble    L[2][numdof];
     5843        IssmDouble    DL[2][2]                  ={{ 0,0 },{0,0}}; //for basal drag
     5844        IssmDouble    DL_scalar;
     5845        IssmDouble    Ke_gg[numdof][numdof]     ={0.0};
     5846        IssmDouble    Ke_gg_gaussian[numdof][numdof]; //stiffness matrix contribution from drag
    58475847        Friction  *friction = NULL;
    58485848        GaussPenta *gauss=NULL;
    58495849        Node       *node_list[numnodes];
     
    58915891                slope_magnitude=sqrt(pow(slope[0],2)+pow(slope[1],2));
    58925892
    58935893                if (slope_magnitude>MAXSLOPE){
    5894                         alpha2=pow((double)10,MOUNTAINKEXPONENT);
     5894                        alpha2=pow((IssmDouble)10,MOUNTAINKEXPONENT);
    58955895                }
    58965896
    58975897                GetTriaJacobianDeterminant(&Jdet2d, &xyz_list_tria[0][0],gauss);
     
    59465946
    59475947        /*Intermediaries */
    59485948        int         i,j,ig;
    5949         double      Jdet;
    5950         double      viscosity,stokesreconditioning; //viscosity
    5951         double      epsilon[6]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
    5952         double      xyz_list[NUMVERTICES][3];
    5953         double      B[4][numdofs+3];
    5954         double      Bprime[4][numdofm];
    5955         double      B2[3][numdofm];
    5956         double      Bprime2[3][numdofs+3];
    5957         double      D[4][4]={0.0};            // material matrix, simple scalar matrix.
    5958         double      D2[3][3]={0.0};            // material matrix, simple scalar matrix.
    5959         double      D_scalar;
    5960         double      Ke_gg[numdofs][numdofm]={0.0}; //local element stiffness matrix
    5961         double      Ke_gg2[numdofm][numdofs]={0.0}; //local element stiffness matrix
    5962         double      Ke_gg_gaussian[numdofs+3][numdofm]; //stiffness matrix evaluated at the gaussian point.
    5963         double      Ke_gg_gaussian2[numdofm][numdofs+3]; //stiffness matrix evaluated at the gaussian point.
     5949        IssmDouble      Jdet;
     5950        IssmDouble      viscosity,stokesreconditioning; //viscosity
     5951        IssmDouble      epsilon[6]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
     5952        IssmDouble      xyz_list[NUMVERTICES][3];
     5953        IssmDouble      B[4][numdofs+3];
     5954        IssmDouble      Bprime[4][numdofm];
     5955        IssmDouble      B2[3][numdofm];
     5956        IssmDouble      Bprime2[3][numdofs+3];
     5957        IssmDouble      D[4][4]={0.0};            // material matrix, simple scalar matrix.
     5958        IssmDouble      D2[3][3]={0.0};            // material matrix, simple scalar matrix.
     5959        IssmDouble      D_scalar;
     5960        IssmDouble      Ke_gg[numdofs][numdofm]={0.0}; //local element stiffness matrix
     5961        IssmDouble      Ke_gg2[numdofm][numdofs]={0.0}; //local element stiffness matrix
     5962        IssmDouble      Ke_gg_gaussian[numdofs+3][numdofm]; //stiffness matrix evaluated at the gaussian point.
     5963        IssmDouble      Ke_gg_gaussian2[numdofm][numdofs+3]; //stiffness matrix evaluated at the gaussian point.
    59645964        GaussPenta *gauss=NULL;
    59655965        GaussTria  *gauss_tria=NULL;
    59665966        Node       *node_list[numnodes];
     
    60536053        /*Intermediaries */
    60546054        int        i,j,ig;
    60556055        int        analysis_type,approximation;
    6056         double     stokesreconditioning;
    6057         double     viscosity,alpha2_gauss,Jdet2d;
    6058         double    bed_normal[3];
    6059         double     epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
    6060         double     xyz_list[NUMVERTICES][3];
    6061         double    xyz_list_tria[NUMVERTICES2D][3];
    6062         double     LMacAyealStokes[8][numdof2dm];
    6063         double     LprimeMacAyealStokes[8][numdof2d];
    6064         double     DLMacAyealStokes[8][8]={0.0};
    6065         double     LStokesMacAyeal[4][numdof2d];
    6066         double     LprimeStokesMacAyeal[4][numdof2dm];
    6067         double     DLStokesMacAyeal[4][4]={0.0};
    6068         double     Ke_drag_gaussian[numdof2dm][numdof2d];
    6069         double     Ke_drag_gaussian2[numdof2d][numdof2dm];
     6056        IssmDouble     stokesreconditioning;
     6057        IssmDouble     viscosity,alpha2_gauss,Jdet2d;
     6058        IssmDouble        bed_normal[3];
     6059        IssmDouble     epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
     6060        IssmDouble     xyz_list[NUMVERTICES][3];
     6061        IssmDouble        xyz_list_tria[NUMVERTICES2D][3];
     6062        IssmDouble     LMacAyealStokes[8][numdof2dm];
     6063        IssmDouble     LprimeMacAyealStokes[8][numdof2d];
     6064        IssmDouble     DLMacAyealStokes[8][8]={0.0};
     6065        IssmDouble     LStokesMacAyeal[4][numdof2d];
     6066        IssmDouble     LprimeStokesMacAyeal[4][numdof2dm];
     6067        IssmDouble     DLStokesMacAyeal[4][4]={0.0};
     6068        IssmDouble     Ke_drag_gaussian[numdof2dm][numdof2d];
     6069        IssmDouble     Ke_drag_gaussian2[numdof2d][numdof2dm];
    60706070        Friction*  friction=NULL;
    60716071        GaussPenta *gauss=NULL;
    60726072        Node       *node_list[numnodes];
     
    62416241        /*Intermediaries*/
    62426242        int       connectivity[2];
    62436243        int       i,i0,i1,j0,j1;
    6244         double    one0,one1;
     6244        IssmDouble    one0,one1;
    62456245
    62466246        /*Initialize Element matrix*/
    62476247        ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,NoneApproximationEnum);
     
    62586258                /*Find connectivity for the two nodes*/
    62596259                connectivity[0]=nodes[i]->GetConnectivity();
    62606260                connectivity[1]=nodes[i+3]->GetConnectivity();
    6261                 one0=1/(double)connectivity[0];
    6262                 one1=1/(double)connectivity[1];
     6261                one0=1/(IssmDouble)connectivity[0];
     6262                one1=1/(IssmDouble)connectivity[1];
    62636263
    62646264                /*Create matrix for these two nodes*/
    62656265                if (IsOnBed() && IsOnSurface()){
     
    63406340
    63416341        /*Intermediaries */
    63426342        int         i,j,ig,approximation;
    6343         double      Jdet;
    6344         double      viscosity, oldviscosity, newviscosity, viscosity_overshoot;
    6345         double      epsilon[5],oldepsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
    6346         double      epsilons[6]; //6 for stokes
    6347         double      xyz_list[NUMVERTICES][3];
    6348         double      B[3][numdof2d];
    6349         double      Bprime[3][numdof2d];
    6350         double      D[3][3]={0.0};            // material matrix, simple scalar matrix.
    6351         double      D_scalar;
    6352         double      Ke_gg_gaussian[numdof2d][numdof2d]; //stiffness matrix evaluated at the gaussian point.
     6343        IssmDouble      Jdet;
     6344        IssmDouble      viscosity, oldviscosity, newviscosity, viscosity_overshoot;
     6345        IssmDouble      epsilon[5],oldepsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
     6346        IssmDouble      epsilons[6]; //6 for stokes
     6347        IssmDouble      xyz_list[NUMVERTICES][3];
     6348        IssmDouble      B[3][numdof2d];
     6349        IssmDouble      Bprime[3][numdof2d];
     6350        IssmDouble      D[3][3]={0.0};            // material matrix, simple scalar matrix.
     6351        IssmDouble      D_scalar;
     6352        IssmDouble      Ke_gg_gaussian[numdof2d][numdof2d]; //stiffness matrix evaluated at the gaussian point.
    63536353        Tria*       tria=NULL;
    63546354        Penta*      pentabase=NULL;
    63556355        GaussPenta *gauss=NULL;
     
    64936493        /*Intermediaries */
    64946494        int        i,j,ig;
    64956495        int        approximation;
    6496         double     xyz_list[NUMVERTICES][3];
    6497         double     Jdet;
    6498         double     viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity
    6499         double     epsilon[5],oldepsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
    6500         double     D_scalar;
    6501         double     D[5][5]={0.0};            // material matrix, simple scalar matrix.
    6502         double     B[5][numdof];
    6503         double     Bprime[5][numdof];
     6496        IssmDouble     xyz_list[NUMVERTICES][3];
     6497        IssmDouble     Jdet;
     6498        IssmDouble     viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity
     6499        IssmDouble     epsilon[5],oldepsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
     6500        IssmDouble     D_scalar;
     6501        IssmDouble     D[5][5]={0.0};            // material matrix, simple scalar matrix.
     6502        IssmDouble     B[5][numdof];
     6503        IssmDouble     Bprime[5][numdof];
    65046504        Tria*      tria=NULL;
    65056505        GaussPenta *gauss=NULL;
    65066506
     
    65586558        /*Intermediaries */
    65596559        int       i,j,ig;
    65606560        int       analysis_type;
    6561         double    xyz_list[NUMVERTICES][3];
    6562         double    xyz_list_tria[NUMVERTICES2D][3]={0.0};
    6563         double    slope_magnitude,alpha2,Jdet;
    6564         double    slope[3]={0.0,0.0,0.0};
    6565         double    MAXSLOPE=.06; // 6 %
    6566         double    MOUNTAINKEXPONENT=10;
    6567         double    L[2][numdof];
    6568         double    DL[2][2]={{ 0,0 },{0,0}}; //for basal drag
    6569         double    DL_scalar;
     6561        IssmDouble    xyz_list[NUMVERTICES][3];
     6562        IssmDouble    xyz_list_tria[NUMVERTICES2D][3]={0.0};
     6563        IssmDouble    slope_magnitude,alpha2,Jdet;
     6564        IssmDouble    slope[3]={0.0,0.0,0.0};
     6565        IssmDouble    MAXSLOPE=.06; // 6 %
     6566        IssmDouble    MOUNTAINKEXPONENT=10;
     6567        IssmDouble    L[2][numdof];
     6568        IssmDouble    DL[2][2]={{ 0,0 },{0,0}}; //for basal drag
     6569        IssmDouble    DL_scalar;
    65706570        Friction  *friction = NULL;
    65716571        GaussPenta *gauss=NULL;
    65726572
     
    66036603                // If we have a slope > 6% for this element,  it means  we are on a mountain. In this particular case,
    66046604                //velocity should be = 0. To achieve this result, we set alpha2_list to a very high value: */
    66056605                if (slope_magnitude>MAXSLOPE){
    6606                         alpha2=pow((double)10,MOUNTAINKEXPONENT);
     6606                        alpha2=pow((IssmDouble)10,MOUNTAINKEXPONENT);
    66076607                }
    66086608               
    66096609                DL_scalar=alpha2*gauss->weight*Jdet;
     
    66596659
    66606660        /*Intermediaries */
    66616661        int        i,j,ig,approximation;
    6662         double     Jdet,viscosity,stokesreconditioning;
    6663         double     xyz_list[NUMVERTICES][3];
    6664         double     epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
    6665         double     B[8][27];
    6666         double     B_prime[8][27];
    6667         double     D_scalar;
    6668         double     D[8][8]={0.0};
    6669         double     Ke_temp[27][27]={0.0}; //for the six nodes and the bubble
     6662        IssmDouble     Jdet,viscosity,stokesreconditioning;
     6663        IssmDouble     xyz_list[NUMVERTICES][3];
     6664        IssmDouble     epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
     6665        IssmDouble     B[8][27];
     6666        IssmDouble     B_prime[8][27];
     6667        IssmDouble     D_scalar;
     6668        IssmDouble     D[8][8]={0.0};
     6669        IssmDouble     Ke_temp[27][27]={0.0}; //for the six nodes and the bubble
    66706670        GaussPenta *gauss=NULL;
    66716671
    66726672        /*If on water or not Stokes, skip stiffness: */
     
    67256725        /*Intermediaries */
    67266726        int        i,j,ig;
    67276727        int        analysis_type,approximation;
    6728         double     alpha2,Jdet2d;
    6729         double     stokesreconditioning,viscosity;
    6730         double     epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
    6731         double     xyz_list[NUMVERTICES][3];
    6732         double    xyz_list_tria[NUMVERTICES2D][3];
    6733         double     LStokes[2][numdof2d];
    6734         double     DLStokes[2][2]={0.0};
    6735         double     Ke_drag_gaussian[numdof2d][numdof2d];
     6728        IssmDouble     alpha2,Jdet2d;
     6729        IssmDouble     stokesreconditioning,viscosity;
     6730        IssmDouble     epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
     6731        IssmDouble     xyz_list[NUMVERTICES][3];
     6732        IssmDouble        xyz_list_tria[NUMVERTICES2D][3];
     6733        IssmDouble     LStokes[2][numdof2d];
     6734        IssmDouble     DLStokes[2][2]={0.0};
     6735        IssmDouble     Ke_drag_gaussian[numdof2d][numdof2d];
    67366736        Friction*  friction=NULL;
    67376737        GaussPenta *gauss=NULL;
    67386738
     
    68106810
    68116811        /*Intermediaries */
    68126812        int         i,j,ig;
    6813         double      Jdet;
    6814         double      xyz_list[NUMVERTICES][3];
    6815         double      B[NDOF1][NUMVERTICES];
    6816         double      Bprime[NDOF1][NUMVERTICES];
    6817         double      DL_scalar;
     6813        IssmDouble      Jdet;
     6814        IssmDouble      xyz_list[NUMVERTICES][3];
     6815        IssmDouble      B[NDOF1][NUMVERTICES];
     6816        IssmDouble      Bprime[NDOF1][NUMVERTICES];
     6817        IssmDouble      DL_scalar;
    68186818        GaussPenta  *gauss=NULL;
    68196819
    68206820        /*Initialize Element matrix*/
     
    68566856
    68576857        /*Intermediaries */
    68586858        int       i,j,ig;
    6859         double    xyz_list[NUMVERTICES][3];
    6860         double    xyz_list_tria[NUMVERTICES2D][3];
    6861         double    surface_normal[3];
    6862         double    Jdet2d,DL_scalar;
    6863         double    basis[NUMVERTICES];
     6859        IssmDouble    xyz_list[NUMVERTICES][3];
     6860        IssmDouble    xyz_list_tria[NUMVERTICES2D][3];
     6861        IssmDouble    surface_normal[3];
     6862        IssmDouble    Jdet2d,DL_scalar;
     6863        IssmDouble    basis[NUMVERTICES];
    68646864        GaussPenta *gauss=NULL;
    68656865
    68666866        /*Initialize Element matrix*/
     
    69166916        /*Intermediaries */
    69176917        int         i,j,ig;
    69186918        int         approximation;
    6919         double      viscosity,Jdet;
    6920         double      stokesreconditioning;
    6921         double      epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
    6922         double      dw[3];
    6923         double      xyz_list[NUMVERTICES][3];
    6924         double      basis[6]; //for the six nodes of the penta
    6925         double      dbasis[3][6]; //for the six nodes of the penta
     6919        IssmDouble      viscosity,Jdet;
     6920        IssmDouble      stokesreconditioning;
     6921        IssmDouble      epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
     6922        IssmDouble      dw[3];
     6923        IssmDouble      xyz_list[NUMVERTICES][3];
     6924        IssmDouble      basis[6]; //for the six nodes of the penta
     6925        IssmDouble      dbasis[3][6]; //for the six nodes of the penta
    69266926        GaussPenta *gauss=NULL;
    69276927
    69286928        /*Initialize Element vector and return if necessary*/
     
    69786978        /*Intermediaries*/
    69796979        int         i,j,ig;
    69806980        int         approximation,analysis_type;
    6981         double      Jdet,Jdet2d;
    6982         double      stokesreconditioning;
    6983         double     bed_normal[3];
    6984         double      epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
    6985         double      viscosity, w, alpha2_gauss;
    6986         double      dw[3];
    6987         double     xyz_list_tria[NUMVERTICES2D][3];
    6988         double      xyz_list[NUMVERTICES][3];
    6989         double      basis[6]; //for the six nodes of the penta
     6981        IssmDouble      Jdet,Jdet2d;
     6982        IssmDouble      stokesreconditioning;
     6983        IssmDouble         bed_normal[3];
     6984        IssmDouble      epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
     6985        IssmDouble      viscosity, w, alpha2_gauss;
     6986        IssmDouble      dw[3];
     6987        IssmDouble         xyz_list_tria[NUMVERTICES2D][3];
     6988        IssmDouble      xyz_list[NUMVERTICES][3];
     6989        IssmDouble      basis[6]; //for the six nodes of the penta
    69906990        Tria*       tria=NULL;
    69916991        Friction*   friction=NULL;
    69926992        GaussPenta  *gauss=NULL;
     
    70677067        /*Intermediaries */
    70687068        int         i,j,ig;
    70697069        int         approximation;
    7070         double      viscosity,Jdet;
    7071         double      stokesreconditioning;
    7072         double      epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
    7073         double      dw[3];
    7074         double      xyz_list[NUMVERTICES][3];
    7075         double      basis[6]; //for the six nodes of the penta
    7076         double      dbasis[3][6]; //for the six nodes of the penta
     7070        IssmDouble      viscosity,Jdet;
     7071        IssmDouble      stokesreconditioning;
     7072        IssmDouble      epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
     7073        IssmDouble      dw[3];
     7074        IssmDouble      xyz_list[NUMVERTICES][3];
     7075        IssmDouble      basis[6]; //for the six nodes of the penta
     7076        IssmDouble      dbasis[3][6]; //for the six nodes of the penta
    70777077        GaussPenta *gauss=NULL;
    70787078
    70797079        /*Initialize Element vector and return if necessary*/
     
    71297129        /*Intermediaries*/
    71307130        int         i,j,ig;
    71317131        int         approximation,analysis_type;
    7132         double      Jdet,Jdet2d;
    7133         double      stokesreconditioning;
    7134         double     bed_normal[3];
    7135         double      epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
    7136         double      viscosity, w, alpha2_gauss;
    7137         double      dw[3];
    7138         double     xyz_list_tria[NUMVERTICES2D][3];
    7139         double      xyz_list[NUMVERTICES][3];
    7140         double      basis[6]; //for the six nodes of the penta
     7132        IssmDouble      Jdet,Jdet2d;
     7133        IssmDouble      stokesreconditioning;
     7134        IssmDouble         bed_normal[3];
     7135        IssmDouble      epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
     7136        IssmDouble      viscosity, w, alpha2_gauss;
     7137        IssmDouble      dw[3];
     7138        IssmDouble         xyz_list_tria[NUMVERTICES2D][3];
     7139        IssmDouble      xyz_list[NUMVERTICES][3];
     7140        IssmDouble      basis[6]; //for the six nodes of the penta
    71417141        Tria*       tria=NULL;
    71427142        Friction*   friction=NULL;
    71437143        GaussPenta  *gauss=NULL;
     
    72797279        int          i,j,k,ig;
    72807280        int          node0,node1;
    72817281        int          connectivity[2];
    7282         double       Jdet;
    7283         double       xyz_list[NUMVERTICES][3];
    7284         double       xyz_list_segment[2][3];
    7285         double       z_list[NUMVERTICES];
    7286         double       z_segment[2],slope[2];
    7287         double       slope2,constant_part;
    7288         double       rho_ice,gravity,n,B;
    7289         double       ub,vb,z_g,surface,thickness;
     7282        IssmDouble       Jdet;
     7283        IssmDouble       xyz_list[NUMVERTICES][3];
     7284        IssmDouble       xyz_list_segment[2][3];
     7285        IssmDouble       z_list[NUMVERTICES];
     7286        IssmDouble       z_segment[2],slope[2];
     7287        IssmDouble       slope2,constant_part;
     7288        IssmDouble       rho_ice,gravity,n,B;
     7289        IssmDouble       ub,vb,z_g,surface,thickness;
    72907290        GaussPenta*  gauss=NULL;
    72917291
    72927292        /*Initialize Element vector*/
     
    73347334                        GetSegmentJacobianDeterminant(&Jdet,&xyz_list_segment[0][0],gauss);
    73357335
    73367336                        if (IsOnSurface()){
    7337                                 for(j=0;j<NDOF2;j++) pe->values[2*node1+j]+=constant_part*pow((surface-z_g)/B,n)*slope[j]*Jdet*gauss->weight/(double)connectivity[1];
     7337                                for(j=0;j<NDOF2;j++) pe->values[2*node1+j]+=constant_part*pow((surface-z_g)/B,n)*slope[j]*Jdet*gauss->weight/(IssmDouble)connectivity[1];
    73387338                        }
    73397339                        else{//connectivity is too large, should take only half on it
    7340                                 for(j=0;j<NDOF2;j++) pe->values[2*node1+j]+=constant_part*pow((surface-z_g)/B,n)*slope[j]*Jdet*gauss->weight*2/(double)connectivity[1];
     7340                                for(j=0;j<NDOF2;j++) pe->values[2*node1+j]+=constant_part*pow((surface-z_g)/B,n)*slope[j]*Jdet*gauss->weight*2/(IssmDouble)connectivity[1];
    73417341                        }
    73427342                }
    73437343                delete gauss;
    73447344
    73457345                //Deal with lower surface
    73467346                if (IsOnBed()){
    7347                         constant_part=-1.58*pow((double)10.0,-(double)10.0)*rho_ice*gravity*thickness;
     7347                        constant_part=-1.58*pow((IssmDouble)10.0,-(IssmDouble)10.0)*rho_ice*gravity*thickness;
    73487348                        ub=constant_part*slope[0];
    73497349                        vb=constant_part*slope[1];
    73507350
    7351                         pe->values[2*node0]+=ub/(double)connectivity[0];
    7352                         pe->values[2*node0+1]+=vb/(double)connectivity[0];
     7351                        pe->values[2*node0]+=ub/(IssmDouble)connectivity[0];
     7352                        pe->values[2*node0+1]+=vb/(IssmDouble)connectivity[0];
    73537353                }
    73547354        }
    73557355
     
    73797379
    73807380        /*Intermediaries*/
    73817381        int         i,j,ig;
    7382         double      Jdet;
    7383         double      slope[3]; //do not put 2! this goes into GetInputDerivativeValue, which addresses slope[3] also!
    7384         double      driving_stress_baseline,thickness;
    7385         double      xyz_list[NUMVERTICES][3];
    7386         double      basis[6];
     7382        IssmDouble      Jdet;
     7383        IssmDouble      slope[3]; //do not put 2! this goes into GetInputDerivativeValue, which addresses slope[3] also!
     7384        IssmDouble      driving_stress_baseline,thickness;
     7385        IssmDouble      xyz_list[NUMVERTICES][3];
     7386        IssmDouble      basis[6];
    73877387        GaussPenta  *gauss=NULL;
    73887388
    73897389        /*Initialize Element vector*/
     
    74427442        /*Intermediaries*/
    74437443        int        i,j,ig;
    74447444        int        approximation;
    7445         double     Jdet,viscosity;
    7446         double     gravity,rho_ice,stokesreconditioning;
    7447         double     xyz_list[NUMVERTICES][3];
    7448         double     epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
    7449         double     l1l7[7]; //for the six nodes and the bubble
    7450         double     B[8][numdofbubble];
    7451         double     B_prime[8][numdofbubble];
    7452         double     B_prime_bubble[8][3];
    7453         double     D[8][8]={0.0};
    7454         double     D_scalar;
    7455         double     Pe_gaussian[numdofbubble]={0.0}; //for the six nodes and the bubble
    7456         double     Ke_temp[numdofbubble][3]={0.0}; //for the six nodes and the bubble
    7457         double     Ke_gaussian[numdofbubble][3];
     7445        IssmDouble     Jdet,viscosity;
     7446        IssmDouble     gravity,rho_ice,stokesreconditioning;
     7447        IssmDouble     xyz_list[NUMVERTICES][3];
     7448        IssmDouble     epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
     7449        IssmDouble     l1l7[7]; //for the six nodes and the bubble
     7450        IssmDouble     B[8][numdofbubble];
     7451        IssmDouble     B_prime[8][numdofbubble];
     7452        IssmDouble     B_prime_bubble[8][3];
     7453        IssmDouble     D[8][8]={0.0};
     7454        IssmDouble     D_scalar;
     7455        IssmDouble     Pe_gaussian[numdofbubble]={0.0}; //for the six nodes and the bubble
     7456        IssmDouble     Ke_temp[numdofbubble][3]={0.0}; //for the six nodes and the bubble
     7457        IssmDouble     Ke_gaussian[numdofbubble][3];
    74587458        GaussPenta *gauss=NULL;
    74597459
    74607460        /*Initialize Element vector and return if necessary*/
     
    75197519        /*Intermediaries*/
    75207520        int         i,j,ig;
    75217521        int         approximation,shelf_dampening;
    7522         double      gravity,rho_water,bed,water_pressure;
    7523         double      damper,normal_vel,vx,vy,vz,dt;
    7524         double          xyz_list_tria[NUMVERTICES2D][3];
    7525         double      xyz_list[NUMVERTICES][3];
    7526         double          bed_normal[3];
    7527         double      dz[3];
    7528         double      basis[6]; //for the six nodes of the penta
    7529         double      Jdet2d;
     7522        IssmDouble      gravity,rho_water,bed,water_pressure;
     7523        IssmDouble      damper,normal_vel,vx,vy,vz,dt;
     7524        IssmDouble              xyz_list_tria[NUMVERTICES2D][3];
     7525        IssmDouble      xyz_list[NUMVERTICES][3];
     7526        IssmDouble              bed_normal[3];
     7527        IssmDouble      dz[3];
     7528        IssmDouble      basis[6]; //for the six nodes of the penta
     7529        IssmDouble      Jdet2d;
    75307530        GaussPenta  *gauss=NULL;
    75317531
    75327532        /*Initialize Element vector and return if necessary*/
     
    76047604        /*Intermediaries*/
    76057605        int        i,ig;
    76067606        int        approximation;
    7607         double     Jdet;
    7608         double     xyz_list[NUMVERTICES][3];
    7609         double     dudx,dvdy,dwdz;
    7610         double     du[3],dv[3],dw[3];
    7611         double     basis[6];
     7607        IssmDouble     Jdet;
     7608        IssmDouble     xyz_list[NUMVERTICES][3];
     7609        IssmDouble     dudx,dvdy,dwdz;
     7610        IssmDouble     du[3],dv[3],dw[3];
     7611        IssmDouble     basis[6];
    76127612        GaussPenta *gauss=NULL;
    76137613
    76147614        /*Initialize Element vector*/
     
    76617661        /*Intermediaries */
    76627662        int        i,j,ig;
    76637663        int        approximation;
    7664         double     xyz_list[NUMVERTICES][3];
    7665         double     xyz_list_tria[NUMVERTICES2D][3];
    7666         double     Jdet2d;
    7667         double     vx,vy,vz,dbdx,dbdy,basalmeltingvalue;
    7668         double     slope[3];
    7669         double     basis[NUMVERTICES];
     7664        IssmDouble     xyz_list[NUMVERTICES][3];
     7665        IssmDouble     xyz_list_tria[NUMVERTICES2D][3];
     7666        IssmDouble     Jdet2d;
     7667        IssmDouble     vx,vy,vz,dbdx,dbdy,basalmeltingvalue;
     7668        IssmDouble     slope[3];
     7669        IssmDouble     basis[NUMVERTICES];
    76707670        GaussPenta* gauss=NULL;
    76717671
    76727672        if (!IsOnBed()) return NULL;
     
    77677767
    77687768        /*Intermediaries */
    77697769        int        i,j,ig;
    7770         double     xyz_list[NUMVERTICES][3];
    7771         double     Jdet;
    7772         double     eps1dotdphii,eps1dotdphij;
    7773         double     eps2dotdphii,eps2dotdphij;
    7774         double     mu_prime;
    7775         double     epsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
    7776         double     eps1[3],eps2[3];
    7777         double     phi[NUMVERTICES];
    7778         double     dphi[3][NUMVERTICES];
     7770        IssmDouble     xyz_list[NUMVERTICES][3];
     7771        IssmDouble     Jdet;
     7772        IssmDouble     eps1dotdphii,eps1dotdphij;
     7773        IssmDouble     eps2dotdphii,eps2dotdphij;
     7774        IssmDouble     mu_prime;
     7775        IssmDouble     epsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
     7776        IssmDouble     eps1[3],eps2[3];
     7777        IssmDouble     phi[NUMVERTICES];
     7778        IssmDouble     dphi[3][NUMVERTICES];
    77797779        GaussPenta *gauss=NULL;
    77807780
    77817781        /*Initialize Jacobian with regular Pattyn (first part of the Gateau derivative)*/
     
    78327832
    78337833        /*Intermediaries */
    78347834        int        i,j,ig;
    7835         double     xyz_list[NUMVERTICES][3];
    7836         double     Jdet;
    7837         double     eps1dotdphii,eps1dotdphij;
    7838         double     eps2dotdphii,eps2dotdphij;
    7839         double     eps3dotdphii,eps3dotdphij;
    7840         double     mu_prime;
    7841         double     epsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
    7842         double     eps1[3],eps2[3],eps3[3];
    7843         double     phi[NUMVERTICES];
    7844         double     dphi[3][NUMVERTICES];
     7835        IssmDouble     xyz_list[NUMVERTICES][3];
     7836        IssmDouble     Jdet;
     7837        IssmDouble     eps1dotdphii,eps1dotdphij;
     7838        IssmDouble     eps2dotdphii,eps2dotdphij;
     7839        IssmDouble     eps3dotdphii,eps3dotdphij;
     7840        IssmDouble     mu_prime;
     7841        IssmDouble     epsilon[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
     7842        IssmDouble     eps1[3],eps2[3],eps3[3];
     7843        IssmDouble     phi[NUMVERTICES];
     7844        IssmDouble     dphi[3][NUMVERTICES];
    78457845        GaussPenta *gauss=NULL;
    78467846
    78477847        /*Initialize Jacobian with regular Stokes (first part of the Gateau derivative)*/
     
    79087908        int          i;
    79097909        int          approximation;
    79107910        int*         doflist=NULL;
    7911         double       vx,vy;
    7912         double       values[numdof];
     7911        IssmDouble       vx,vy;
     7912        IssmDouble       values[numdof];
    79137913        GaussPenta*  gauss;
    79147914
    79157915        /*Get approximation enum and dof list: */
     
    79497949
    79507950        int          i;
    79517951        int*         doflist=NULL;
    7952         double       vx,vy;
    7953         double       values[numdof];
     7952        IssmDouble       vx,vy;
     7953        IssmDouble       values[numdof];
    79547954        GaussPenta*  gauss=NULL;
    79557955
    79567956        /*Get dof list: */
     
    79857985
    79867986        int          i;
    79877987        int*         doflist=NULL;
    7988         double       vz;
    7989         double       values[numdof];
     7988        IssmDouble       vz;
     7989        IssmDouble       values[numdof];
    79907990        GaussPenta*  gauss=NULL;
    79917991
    79927992        /*Get dof list: */
     
    80188018
    80198019        int          i;
    80208020        int*         doflist=NULL;
    8021         double       vx,vy,vz,p;
    8022         double       stokesreconditioning;
    8023         double       values[numdof];
     8021        IssmDouble       vx,vy,vz,p;
     8022        IssmDouble       stokesreconditioning;
     8023        IssmDouble       values[numdof];
    80248024        GaussPenta   *gauss;
    80258025
    80268026        /*Get dof list: */
     
    80578057}
    80588058/*}}}*/
    80598059/*FUNCTION Penta::InputUpdateFromSolutionDiagnosticHoriz {{{*/
    8060 void  Penta::InputUpdateFromSolutionDiagnosticHoriz(double* solution){
     8060void  Penta::InputUpdateFromSolutionDiagnosticHoriz(IssmDouble* solution){
    80618061
    80628062        int  approximation;
    80638063
     
    80938093}
    80948094/*}}}*/
    80958095/*FUNCTION Penta::InputUpdateFromSolutionDiagnosticMacAyeal {{{*/
    8096 void  Penta::InputUpdateFromSolutionDiagnosticMacAyeal(double* solution){
     8096void  Penta::InputUpdateFromSolutionDiagnosticMacAyeal(IssmDouble* solution){
    80978097
    80988098        const int    numdof=NDOF2*NUMVERTICES;
    80998099
    81008100        int     i;
    8101         double  rho_ice,g;
    8102         double  values[numdof];
    8103         double  vx[NUMVERTICES];
    8104         double  vy[NUMVERTICES];
    8105         double  vz[NUMVERTICES];
    8106         double  vel[NUMVERTICES];
    8107         double  pressure[NUMVERTICES];
    8108         double  surface[NUMVERTICES];
    8109         double  xyz_list[NUMVERTICES][3];
     8101        IssmDouble  rho_ice,g;
     8102        IssmDouble  values[numdof];
     8103        IssmDouble  vx[NUMVERTICES];
     8104        IssmDouble  vy[NUMVERTICES];
     8105        IssmDouble  vz[NUMVERTICES];
     8106        IssmDouble  vel[NUMVERTICES];
     8107        IssmDouble  pressure[NUMVERTICES];
     8108        IssmDouble  surface[NUMVERTICES];
     8109        IssmDouble  xyz_list[NUMVERTICES][3];
    81108110        int    *doflist = NULL;
    81118111        Penta  *penta   = NULL;
    81128112
     
    81748174}
    81758175/*}}}*/
    81768176/*FUNCTION Penta::InputUpdateFromSolutionDiagnosticMacAyealPattyn {{{*/
    8177 void  Penta::InputUpdateFromSolutionDiagnosticMacAyealPattyn(double* solution){
     8177void  Penta::InputUpdateFromSolutionDiagnosticMacAyealPattyn(IssmDouble* solution){
    81788178
    81798179        const int    numdof=NDOF2*NUMVERTICES;
    81808180        const int    numdof2d=NDOF2*NUMVERTICES2D;
    81818181
    81828182        int     i;
    8183         double  rho_ice,g;
    8184         double  macayeal_values[numdof];
    8185         double  pattyn_values[numdof];
    8186         double  vx[NUMVERTICES];
    8187         double  vy[NUMVERTICES];
    8188         double  vz[NUMVERTICES];
    8189         double  vel[NUMVERTICES];
    8190         double  pressure[NUMVERTICES];
    8191         double  surface[NUMVERTICES];
    8192         double  xyz_list[NUMVERTICES][3];
     8183        IssmDouble  rho_ice,g;
     8184        IssmDouble  macayeal_values[numdof];
     8185        IssmDouble  pattyn_values[numdof];
     8186        IssmDouble  vx[NUMVERTICES];
     8187        IssmDouble  vy[NUMVERTICES];
     8188        IssmDouble  vz[NUMVERTICES];
     8189        IssmDouble  vel[NUMVERTICES];
     8190        IssmDouble  pressure[NUMVERTICES];
     8191        IssmDouble  surface[NUMVERTICES];
     8192        IssmDouble  xyz_list[NUMVERTICES][3];
    81938193        int*    doflistp = NULL;
    81948194        int*    doflistm = NULL;
    81958195        Penta   *penta   = NULL;
     
    82588258}
    82598259/*}}}*/
    82608260/*FUNCTION Penta::InputUpdateFromSolutionDiagnosticMacAyealStokes {{{*/
    8261 void  Penta::InputUpdateFromSolutionDiagnosticMacAyealStokes(double* solution){
     8261void  Penta::InputUpdateFromSolutionDiagnosticMacAyealStokes(IssmDouble* solution){
    82628262
    82638263        const int    numdofm=NDOF2*NUMVERTICES;
    82648264        const int    numdofs=NDOF4*NUMVERTICES;
    82658265        const int    numdof2d=NDOF2*NUMVERTICES2D;
    82668266
    82678267        int     i;
    8268         double  stokesreconditioning;
    8269         double  macayeal_values[numdofm];
    8270         double  stokes_values[numdofs];
    8271         double  vx[NUMVERTICES];
    8272         double  vy[NUMVERTICES];
    8273         double  vz[NUMVERTICES];
    8274         double  vzmacayeal[NUMVERTICES];
    8275         double  vzstokes[NUMVERTICES];
    8276         double  vel[NUMVERTICES];
    8277         double  pressure[NUMVERTICES];
    8278         double  xyz_list[NUMVERTICES][3];
     8268        IssmDouble  stokesreconditioning;
     8269        IssmDouble  macayeal_values[numdofm];
     8270        IssmDouble  stokes_values[numdofs];
     8271        IssmDouble  vx[NUMVERTICES];
     8272        IssmDouble  vy[NUMVERTICES];
     8273        IssmDouble  vz[NUMVERTICES];
     8274        IssmDouble  vzmacayeal[NUMVERTICES];
     8275        IssmDouble  vzstokes[NUMVERTICES];
     8276        IssmDouble  vel[NUMVERTICES];
     8277        IssmDouble  pressure[NUMVERTICES];
     8278        IssmDouble  xyz_list[NUMVERTICES][3];
    82798279        int*    doflistm        = NULL;
    82808280        int*    doflists        = NULL;
    82818281        Penta   *penta          = NULL;
     
    83588358}
    83598359/*}}}*/
    83608360/*FUNCTION Penta::InputUpdateFromSolutionDiagnosticPattyn {{{*/
    8361 void  Penta::InputUpdateFromSolutionDiagnosticPattyn(double* solution){
     8361void  Penta::InputUpdateFromSolutionDiagnosticPattyn(IssmDouble* solution){
    83628362       
    83638363        const int    numdof=NDOF2*NUMVERTICES;
    83648364
    83658365        int    i;
    8366         double rho_ice,g;
    8367         double values[numdof];
    8368         double vx[NUMVERTICES];
    8369         double vy[NUMVERTICES];
    8370         double vz[NUMVERTICES];
    8371         double vel[NUMVERTICES];
    8372         double pressure[NUMVERTICES];
    8373         double surface[NUMVERTICES];
    8374         double xyz_list[NUMVERTICES][3];
     8366        IssmDouble rho_ice,g;
     8367        IssmDouble values[numdof];
     8368        IssmDouble vx[NUMVERTICES];
     8369        IssmDouble vy[NUMVERTICES];
     8370        IssmDouble vz[NUMVERTICES];
     8371        IssmDouble vel[NUMVERTICES];
     8372        IssmDouble pressure[NUMVERTICES];
     8373        IssmDouble surface[NUMVERTICES];
     8374        IssmDouble xyz_list[NUMVERTICES][3];
    83758375        int*   doflist = NULL;
    83768376
    83778377        /*Get dof list: */
     
    84328432}
    84338433/*}}}*/
    84348434/*FUNCTION Penta::InputUpdateFromSolutionDiagnosticPattynStokes {{{*/
    8435 void  Penta::InputUpdateFromSolutionDiagnosticPattynStokes(double* solution){
     8435void  Penta::InputUpdateFromSolutionDiagnosticPattynStokes(IssmDouble* solution){
    84368436
    84378437        const int    numdofp=NDOF2*NUMVERTICES;
    84388438        const int    numdofs=NDOF4*NUMVERTICES;
    84398439
    84408440        int    i;
    8441         double pattyn_values[numdofp];
    8442         double stokes_values[numdofs];
    8443         double vx[NUMVERTICES];
    8444         double vy[NUMVERTICES];
    8445         double vz[NUMVERTICES];
    8446         double vzpattyn[NUMVERTICES];
    8447         double vzstokes[NUMVERTICES];
    8448         double vel[NUMVERTICES];
    8449         double pressure[NUMVERTICES];
    8450         double xyz_list[NUMVERTICES][3];
    8451         double stokesreconditioning;
     8441        IssmDouble pattyn_values[numdofp];
     8442        IssmDouble stokes_values[numdofs];
     8443        IssmDouble vx[NUMVERTICES];
     8444        IssmDouble vy[NUMVERTICES];
     8445        IssmDouble vz[NUMVERTICES];
     8446        IssmDouble vzpattyn[NUMVERTICES];
     8447        IssmDouble vzstokes[NUMVERTICES];
     8448        IssmDouble vel[NUMVERTICES];
     8449        IssmDouble pressure[NUMVERTICES];
     8450        IssmDouble xyz_list[NUMVERTICES][3];
     8451        IssmDouble stokesreconditioning;
    84528452        int*   doflistp      = NULL;
    84538453        int*   doflists      = NULL;
    84548454        Penta  *penta        = NULL;
     
    85268526}
    85278527/*}}}*/
    85288528/*FUNCTION Penta::InputUpdateFromSolutionDiagnosticHutter {{{*/
    8529 void  Penta::InputUpdateFromSolutionDiagnosticHutter(double* solution){
     8529void  Penta::InputUpdateFromSolutionDiagnosticHutter(IssmDouble* solution){
    85308530       
    85318531        const int    numdof=NDOF2*NUMVERTICES;
    85328532
    85338533        int     i;
    8534         double  rho_ice,g;
    8535         double  values[numdof];
    8536         double  vx[NUMVERTICES];
    8537         double  vy[NUMVERTICES];
    8538         double  vz[NUMVERTICES];
    8539         double  vel[NUMVERTICES];
    8540         double  pressure[NUMVERTICES];
    8541         double  surface[NUMVERTICES];
    8542         double  xyz_list[NUMVERTICES][3];
     8534        IssmDouble  rho_ice,g;
     8535        IssmDouble  values[numdof];
     8536        IssmDouble  vx[NUMVERTICES];
     8537        IssmDouble  vy[NUMVERTICES];
     8538        IssmDouble  vz[NUMVERTICES];
     8539        IssmDouble  vel[NUMVERTICES];
     8540        IssmDouble  pressure[NUMVERTICES];
     8541        IssmDouble  surface[NUMVERTICES];
     8542        IssmDouble  xyz_list[NUMVERTICES][3];
    85438543        int*    doflist = NULL;
    85448544
    85458545        /*Get dof list: */
     
    85898589}
    85908590/*}}}*/
    85918591/*FUNCTION Penta::InputUpdateFromSolutionDiagnosticVert {{{*/
    8592 void  Penta::InputUpdateFromSolutionDiagnosticVert(double* solution){
     8592void  Penta::InputUpdateFromSolutionDiagnosticVert(IssmDouble* solution){
    85938593
    85948594        const int numdof=NDOF1*NUMVERTICES;
    85958595       
    85968596        int      i;
    85978597        int      approximation;
    8598         double   rho_ice,g;
    8599         double   values[numdof];
    8600         double   vx[NUMVERTICES];
    8601         double   vy[NUMVERTICES];
    8602         double   vz[NUMVERTICES];
    8603         double   vzmacayeal[NUMVERTICES];
    8604         double   vzpattyn[NUMVERTICES];
    8605         double   vzstokes[NUMVERTICES];
    8606         double   vel[NUMVERTICES];
    8607         double   pressure[NUMVERTICES];
    8608         double   surface[NUMVERTICES];
    8609         double   xyz_list[NUMVERTICES][3];
     8598        IssmDouble   rho_ice,g;
     8599        IssmDouble   values[numdof];
     8600        IssmDouble   vx[NUMVERTICES];
     8601        IssmDouble   vy[NUMVERTICES];
     8602        IssmDouble   vz[NUMVERTICES];
     8603        IssmDouble   vzmacayeal[NUMVERTICES];
     8604        IssmDouble   vzpattyn[NUMVERTICES];
     8605        IssmDouble   vzstokes[NUMVERTICES];
     8606        IssmDouble   vel[NUMVERTICES];
     8607        IssmDouble   pressure[NUMVERTICES];
     8608        IssmDouble   surface[NUMVERTICES];
     8609        IssmDouble   xyz_list[NUMVERTICES][3];
    86108610        int*     doflist      = NULL;
    86118611
    86128612
     
    86938693}
    86948694/*}}}*/
    86958695/*FUNCTION Penta::InputUpdateFromSolutionDiagnosticStokes {{{*/
    8696 void  Penta::InputUpdateFromSolutionDiagnosticStokes(double* solution){
     8696void  Penta::InputUpdateFromSolutionDiagnosticStokes(IssmDouble* solution){
    86978697       
    86988698        const int numdof=NDOF4*NUMVERTICES;
    86998699
    87008700        int     i;
    8701         double  values[numdof];
    8702         double  vx[NUMVERTICES];
    8703         double  vy[NUMVERTICES];
    8704         double  vz[NUMVERTICES];
    8705         double  vel[NUMVERTICES];
    8706         double  pressure[NUMVERTICES];
    8707         double  stokesreconditioning;
     8701        IssmDouble  values[numdof];
     8702        IssmDouble  vx[NUMVERTICES];
     8703        IssmDouble  vy[NUMVERTICES];
     8704        IssmDouble  vz[NUMVERTICES];
     8705        IssmDouble  vel[NUMVERTICES];
     8706        IssmDouble  pressure[NUMVERTICES];
     8707        IssmDouble  stokesreconditioning;
    87088708        int*    doflist=NULL;
    87098709
    87108710        /*Get dof list: */
  • u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/PentaRef.h

     
    2222                void SetElementType(int type,int type_counter);
    2323
    2424                /*Numerics*/
    25                 void GetNodalFunctionsP1(double* l1l6, GaussPenta* gauss);
    26                 void GetNodalFunctionsMINI(double* l1l7, GaussPenta* gauss);
    27                 void GetNodalFunctionsP1Derivatives(double* dh1dh6,double* xyz_list, GaussPenta* gauss);
    28                 void GetNodalFunctionsMINIDerivatives(double* dh1dh7,double* xyz_list, GaussPenta* gauss);
    29                 void GetNodalFunctionsP1DerivativesReference(double* dl1dl6,GaussPenta* gauss);
    30                 void GetNodalFunctionsMINIDerivativesReference(double* dl1dl7,GaussPenta* gauss);
    31                 void GetQuadNodalFunctions(double* l1l4,GaussPenta* gauss,int index1,int index2,int index3,int index4);
    32                 void GetQuadJacobianDeterminant(double*  Jdet, double xyz_list[4][3],GaussPenta* gauss);
    33                 void GetJacobian(double* J, double* xyz_list,GaussPenta* gauss);
    34                 void GetJacobianDeterminant(double*  Jdet, double* xyz_list,GaussPenta* gauss);
    35                 void GetTriaJacobianDeterminant(double*  Jdet, double* xyz_list,GaussPenta* gauss);
    36                 void GetSegmentJacobianDeterminant(double*  Jdet, double* xyz_list,GaussPenta* gauss);
    37                 void GetJacobianInvert(double*  Jinv, double* xyz_list,GaussPenta* gauss);
    38                 void GetBMacAyealPattyn(double* B, double* xyz_list, GaussPenta* gauss);
    39                 void GetBMacAyealStokes(double* B, double* xyz_list, GaussPenta* gauss);
    40                 void GetBPattyn(double* B, double* xyz_list, GaussPenta* gauss);
    41                 void GetBStokes(double* B, double* xyz_list, GaussPenta* gauss);
    42                 void GetBprimeMacAyealStokes(double* Bprime, double* xyz_list, GaussPenta* gauss);
    43                 void GetBprimePattyn(double* B, double* xyz_list, GaussPenta* gauss);
    44                 void GetBprimeStokes(double* B_prime, double* xyz_list, GaussPenta* gauss);
    45                 void GetBprimeVert(double* B, double* xyz_list, GaussPenta* gauss);
    46                 void GetBAdvec(double* B_advec, double* xyz_list, GaussPenta* gauss);
    47                 void GetBConduct(double* B_conduct, double* xyz_list, GaussPenta* gauss);
    48                 void GetBVert(double* B, double* xyz_list, GaussPenta* gauss);
    49                 void GetBprimeAdvec(double* Bprime_advec, double* xyz_list, GaussPenta* gauss);
    50                 void GetL(double* L, GaussPenta* gauss,int numdof);
    51                 void GetLStokes(double* LStokes, GaussPenta* gauss);
    52                 void GetLprimeStokes(double* LprimeStokes, double* xyz_list, GaussPenta* gauss);
    53                 void GetLMacAyealStokes(double* LMacAyealStokes, GaussPenta* gauss);
    54                 void GetLprimeMacAyealStokes(double* LprimeMacAyealStokes, double* xyz_list, GaussPenta* gauss);
    55                 void GetLStokesMacAyeal(double* LStokesMacAyeal, GaussPenta* gauss);
    56                 void GetLprimeStokesMacAyeal(double* LprimeStokesMacAyeal, double* xyz_list, GaussPenta* gauss);
    57                 void GetInputValue(double* pvalue,double* plist, GaussPenta* gauss);
    58                 void GetInputValue(double* pvalue,double* plist,GaussTria* gauss){_error_("only PentaGauss are supported");};
    59                 void GetInputDerivativeValue(double* pvalues, double* plist,double* xyz_list, GaussPenta* gauss);
    60                 void GetInputDerivativeValue(double* pvalues, double* plist,double* xyz_list, GaussTria* gauss){_error_("only PentaGauss are supported");};
     25                void GetNodalFunctionsP1(IssmDouble* l1l6, GaussPenta* gauss);
     26                void GetNodalFunctionsMINI(IssmDouble* l1l7, GaussPenta* gauss);
     27                void GetNodalFunctionsP1Derivatives(IssmDouble* dh1dh6,IssmDouble* xyz_list, GaussPenta* gauss);
     28                void GetNodalFunctionsMINIDerivatives(IssmDouble* dh1dh7,IssmDouble* xyz_list, GaussPenta* gauss);
     29                void GetNodalFunctionsP1DerivativesReference(IssmDouble* dl1dl6,GaussPenta* gauss);
     30                void GetNodalFunctionsMINIDerivativesReference(IssmDouble* dl1dl7,GaussPenta* gauss);
     31                void GetQuadNodalFunctions(IssmDouble* l1l4,GaussPenta* gauss,int index1,int index2,int index3,int index4);
     32                void GetQuadJacobianDeterminant(IssmDouble*  Jdet, IssmDouble xyz_list[4][3],GaussPenta* gauss);
     33                void GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussPenta* gauss);
     34                void GetJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss);
     35                void GetTriaJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss);
     36                void GetSegmentJacobianDeterminant(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussPenta* gauss);
     37                void GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,GaussPenta* gauss);
     38                void GetBMacAyealPattyn(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
     39                void GetBMacAyealStokes(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
     40                void GetBPattyn(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
     41                void GetBStokes(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
     42                void GetBprimeMacAyealStokes(IssmDouble* Bprime, IssmDouble* xyz_list, GaussPenta* gauss);
     43                void GetBprimePattyn(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
     44                void GetBprimeStokes(IssmDouble* B_prime, IssmDouble* xyz_list, GaussPenta* gauss);
     45                void GetBprimeVert(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
     46                void GetBAdvec(IssmDouble* B_advec, IssmDouble* xyz_list, GaussPenta* gauss);
     47                void GetBConduct(IssmDouble* B_conduct, IssmDouble* xyz_list, GaussPenta* gauss);
     48                void GetBVert(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss);
     49                void GetBprimeAdvec(IssmDouble* Bprime_advec, IssmDouble* xyz_list, GaussPenta* gauss);
     50                void GetL(IssmDouble* L, GaussPenta* gauss,int numdof);
     51                void GetLStokes(IssmDouble* LStokes, GaussPenta* gauss);
     52                void GetLprimeStokes(IssmDouble* LprimeStokes, IssmDouble* xyz_list, GaussPenta* gauss);
     53                void GetLMacAyealStokes(IssmDouble* LMacAyealStokes, GaussPenta* gauss);
     54                void GetLprimeMacAyealStokes(IssmDouble* LprimeMacAyealStokes, IssmDouble* xyz_list, GaussPenta* gauss);
     55                void GetLStokesMacAyeal(IssmDouble* LStokesMacAyeal, GaussPenta* gauss);
     56                void GetLprimeStokesMacAyeal(IssmDouble* LprimeStokesMacAyeal, IssmDouble* xyz_list, GaussPenta* gauss);
     57                void GetInputValue(IssmDouble* pvalue,IssmDouble* plist, GaussPenta* gauss);
     58                void GetInputValue(IssmDouble* pvalue,IssmDouble* plist,GaussTria* gauss){_error_("only PentaGauss are supported");};
     59                void GetInputDerivativeValue(IssmDouble* pvalues, IssmDouble* plist,IssmDouble* xyz_list, GaussPenta* gauss);
     60                void GetInputDerivativeValue(IssmDouble* pvalues, IssmDouble* plist,IssmDouble* xyz_list, GaussTria* gauss){_error_("only PentaGauss are supported");};
    6161
    6262};
    6363#endif
  • u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/Penta.h

     
    5858                /*}}}*/
    5959                /*Update virtual functions definitions: {{{*/
    6060                void  InputUpdateFromConstant(bool constant, int name);
    61                 void  InputUpdateFromConstant(double constant, int name);
     61                void  InputUpdateFromConstant(IssmDouble constant, int name);
    6262                void  InputUpdateFromConstant(int constant, int name);
    63                 void  InputUpdateFromSolution(double* solutiong);
     63                void  InputUpdateFromSolution(IssmDouble* solutiong);
    6464                void  InputUpdateFromVector(bool* vector, int name, int type);
    65                 void  InputUpdateFromVector(double* vector, int name, int type);
     65                void  InputUpdateFromVector(IssmDouble* vector, int name, int type);
    6666                void  InputUpdateFromVector(int* vector, int name, int type);
    6767                #ifdef _HAVE_DAKOTA_
    6868                void  InputUpdateFromVectorDakota(bool* vector, int name, int type);
    69                 void  InputUpdateFromVectorDakota(double* vector, int name, int type);
     69                void  InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);
    7070                void  InputUpdateFromVectorDakota(int* vector, int name, int type);
    71                 void  InputUpdateFromMatrixDakota(double* matrix, int nows, int ncols, int name, int type);
     71                void  InputUpdateFromMatrixDakota(IssmDouble* matrix, int nows, int ncols, int name, int type);
    7272                #endif
    7373                void  InputUpdateFromIoModel(int index, IoModel* iomodel);
    7474                /*}}}*/
    7575                /*Element virtual functions definitions: {{{*/
    76                 void   AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,double* vertex_response,double* qmu_part);
     76                void   AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
    7777                void   BasalFrictionCreateInput(void);
    7878                void   ComputeBasalStress(Vector* sigma_b);
    7979                void   ComputeStrainRate(Vector* eps);
     
    8686                void   DeleteResults(void);
    8787                int    GetNodeIndex(Node* node);
    8888                void   GetSolutionFromInputs(Vector* solution);
    89                 double GetZcoord(GaussPenta* gauss);
     89                IssmDouble GetZcoord(GaussPenta* gauss);
    9090                void   GetVectorFromInputs(Vector* vector,int name_enum);
    9191                void   GetVectorFromResults(Vector* vector,int offset,int interp);
    9292               
    9393                int    Sid();
    94                 void   InputArtificialNoise(int enum_type,double min, double max);
    95                 bool   InputConvergence(double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums);
    96                 void   InputCreate(double scalar,int name,int code);
    97                 void   InputCreate(double* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
     94                void   InputArtificialNoise(int enum_type,IssmDouble min, IssmDouble max);
     95                bool   InputConvergence(IssmDouble* eps, int* enums,int num_enums,int* criterionenums,IssmDouble* criterionvalues,int num_criterionenums);
     96                void   InputCreate(IssmDouble scalar,int name,int code);
     97                void   InputCreate(IssmDouble* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code);
    9898                void   InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum=MeshElementsEnum);
    9999                void   InputDuplicate(int original_enum,int new_enum);
    100                 void   InputScale(int enum_type,double scale_factor);
     100                void   InputScale(int enum_type,IssmDouble scale_factor);
    101101               
    102                 void   InputToResult(int enum_type,int step,double time);
    103                 void   MigrateGroundingLine(double* old_floating_ice,double* sheet_ungrounding);
     102                void   InputToResult(int enum_type,int step,IssmDouble time);
     103                void   MigrateGroundingLine(IssmDouble* old_floating_ice,IssmDouble* sheet_ungrounding);
    104104                void   PotentialSheetUngrounding(Vector* potential_sheet_ungrounding);
    105                 void   RequestedOutput(int output_enum,int step,double time);
    106                 void   ListResultsInfo(int** results_enums,int** results_size,double** results_times,int** results_steps,int* num_results);
     105                void   RequestedOutput(int output_enum,int step,IssmDouble time);
     106                void   ListResultsInfo(int** results_enums,int** results_size,IssmDouble** results_times,int** results_steps,int* num_results);
    107107                void   PatchFill(int* pcount, Patch* patch);
    108108                void   PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes);
    109                 void   PositiveDegreeDay(double* pdds,double* pds,double signorm);
     109                void   PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm);
    110110                void   ProcessResultsUnits(void);
    111111                void   ResetCoordinateSystem(void);
    112                 double SurfaceArea(void);
     112                IssmDouble SurfaceArea(void);
    113113                void   Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type);
    114                 int    UpdatePotentialSheetUngrounding(double* potential_sheet_ungrounding,Vector* vec_nodes_on_iceshelf,double* nodes_on_iceshelf);
    115                 int    NodalValue(double* pvalue, int index, int natureofdataenum,bool process_units);
    116                 double TimeAdapt();
     114                int    UpdatePotentialSheetUngrounding(IssmDouble* potential_sheet_ungrounding,Vector* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf);
     115                int    NodalValue(IssmDouble* pvalue, int index, int natureofdataenum,bool process_units);
     116                IssmDouble TimeAdapt();
    117117                int*   GetHorizontalNeighboorSids(void);
    118118                void   ViscousHeatingCreateInput(void);
    119                 void   SmearFunction(Vector* smearedvector,double (*WeightFunction)(double distance,double radius),double radius);
     119                void   SmearFunction(Vector* smearedvector,IssmDouble (*WeightFunction)(IssmDouble distance,IssmDouble radius),IssmDouble radius);
    120120
    121121                 #ifdef _HAVE_RESPONSES_
    122                 double IceVolume(void);
    123                 void   MinVel(double* pminvel, bool process_units);
    124                 void   MinVx(double* pminvx, bool process_units);
    125                 void   MinVy(double* pminvy, bool process_units);
    126                 void   MinVz(double* pminvz, bool process_units);
    127                 double MassFlux(double* segment,bool process_units);
    128                 void   MaxAbsVx(double* pmaxabsvx, bool process_units);
    129                 void   MaxAbsVy(double* pmaxabsvy, bool process_units);
    130                 void   MaxAbsVz(double* pmaxabsvz, bool process_units);
    131                 void   MaxVel(double* pmaxvel, bool process_units);
    132                 void   ElementResponse(double* presponse,int response_enum,bool process_units);
    133                 void   MaxVx(double* pmaxvx, bool process_units);
    134                 void   MaxVy(double* pmaxvy, bool process_units);
    135                 void   MaxVz(double* pmaxvz, bool process_units);
     122                IssmDouble IceVolume(void);
     123                void   MinVel(IssmDouble* pminvel, bool process_units);
     124                void   MinVx(IssmDouble* pminvx, bool process_units);
     125                void   MinVy(IssmDouble* pminvy, bool process_units);
     126                void   MinVz(IssmDouble* pminvz, bool process_units);
     127                IssmDouble MassFlux(IssmDouble* segment,bool process_units);
     128                void   MaxAbsVx(IssmDouble* pmaxabsvx, bool process_units);
     129                void   MaxAbsVy(IssmDouble* pmaxabsvy, bool process_units);
     130                void   MaxAbsVz(IssmDouble* pmaxabsvz, bool process_units);
     131                void   MaxVel(IssmDouble* pmaxvel, bool process_units);
     132                void   ElementResponse(IssmDouble* presponse,int response_enum,bool process_units);
     133                void   MaxVx(IssmDouble* pmaxvx, bool process_units);
     134                void   MaxVy(IssmDouble* pmaxvy, bool process_units);
     135                void   MaxVz(IssmDouble* pmaxvz, bool process_units);
    136136                #endif
    137137
    138138                #ifdef _HAVE_CONTROL_
    139                 double DragCoefficientAbsGradient(bool process_units,int weight_index);
     139                IssmDouble DragCoefficientAbsGradient(bool process_units,int weight_index);
    140140                void   GradientIndexing(int* indexing,int control_index);
    141141                void   Gradj(Vector* gradient,int control_type,int control_index);
    142142                void   GradjDragMacAyeal(Vector* gradient,int control_index);
     
    146146                void   GradjBbarPattyn(Vector* gradient,int control_index);
    147147                void   GradjBbarStokes(Vector* gradient,int control_index);
    148148                void   GetVectorFromControlInputs(Vector* gradient,int control_enum,int control_index,const char* data);
    149                 void   SetControlInputsFromVector(double* vector,int control_enum,int control_index);
     149                void   SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index);
    150150                void   ControlInputGetGradient(Vector* gradient,int enum_type,int control_index);
    151                 void   ControlInputScaleGradient(int enum_type,double scale);
    152                 void   ControlInputSetGradient(double* gradient,int enum_type,int control_index);
    153                 double RheologyBbarAbsGradient(bool process_units,int weight_index);
    154                 double ThicknessAbsMisfit(     bool process_units,int weight_index);
    155                 double SurfaceAbsVelMisfit(    bool process_units,int weight_index);
    156                 double SurfaceRelVelMisfit(    bool process_units,int weight_index);
    157                 double SurfaceLogVelMisfit(    bool process_units,int weight_index);
    158                 double SurfaceLogVxVyMisfit(   bool process_units,int weight_index);
    159                 double SurfaceAverageVelMisfit(bool process_units,int weight_index);
    160                 double ThicknessAbsGradient(bool process_units,int weight_index);
    161                 void   InputControlUpdate(double scalar,bool save_parameter);
     151                void   ControlInputScaleGradient(int enum_type,IssmDouble scale);
     152                void   ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index);
     153                IssmDouble RheologyBbarAbsGradient(bool process_units,int weight_index);
     154                IssmDouble ThicknessAbsMisfit(     bool process_units,int weight_index);
     155                IssmDouble SurfaceAbsVelMisfit(    bool process_units,int weight_index);
     156                IssmDouble SurfaceRelVelMisfit(    bool process_units,int weight_index);
     157                IssmDouble SurfaceLogVelMisfit(    bool process_units,int weight_index);
     158                IssmDouble SurfaceLogVxVyMisfit(   bool process_units,int weight_index);
     159                IssmDouble SurfaceAverageVelMisfit(bool process_units,int weight_index);
     160                IssmDouble ThicknessAbsGradient(bool process_units,int weight_index);
     161                void   InputControlUpdate(IssmDouble scalar,bool save_parameter);
    162162                #endif
    163163                /*}}}*/
    164164                /*Penta specific routines:{{{*/
    165                 void      BedNormal(double* bed_normal, double xyz_list[3][3]);
     165                void      BedNormal(IssmDouble* bed_normal, IssmDouble xyz_list[3][3]);
    166166                ElementMatrix* CreateKMatrixPrognostic(void);
    167167                ElementMatrix* CreateKMatrixSlope(void);
    168168                ElementVector* CreatePVectorPrognostic(void);
     
    172172                void    GetSidList(int* sidlist);
    173173                void    GetConnectivityList(int* connectivity);
    174174                int     GetElementType(void);
    175                 void    GetElementSizes(double* hx,double* hy,double* hz);
    176                 void    GetInputListOnVertices(double* pvalue,int enumtype);
    177                 void    GetInputListOnVertices(double* pvalue,int enumtype,double defaultvalue);
    178                 void    GetInputValue(double* pvalue,Node* node,int enumtype);
    179                 void      GetPhi(double* phi, double*  epsilon, double viscosity);
     175                void    GetElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz);
     176                void    GetInputListOnVertices(IssmDouble* pvalue,int enumtype);
     177                void    GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue);
     178                void    GetInputValue(IssmDouble* pvalue,Node* node,int enumtype);
     179                void      GetPhi(IssmDouble* phi, IssmDouble*  epsilon, IssmDouble viscosity);
    180180                void      GetSolutionFromInputsEnthalpy(Vector* solutiong);
    181                 double  GetStabilizationParameter(double u, double v, double w, double diameter, double kappa);
    182                 void    GetStrainRate3dPattyn(double* epsilon,double* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input);
    183                 void    GetStrainRate3d(double* epsilon,double* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input, Input* vz_input);
     181                IssmDouble  GetStabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa);
     182                void    GetStrainRate3dPattyn(IssmDouble* epsilon,IssmDouble* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input);
     183                void    GetStrainRate3d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input, Input* vz_input);
    184184                Penta*  GetUpperElement(void);
    185185                Penta*  GetLowerElement(void);
    186186                Penta*  GetBasalElement(void);
    187187                void      InputExtrude(int enum_type,int object_type);
    188                 void    InputUpdateFromSolutionPrognostic(double* solutiong);
    189                 void    InputUpdateFromSolutionOneDof(double* solutiong,int enum_type);
    190                 void    InputUpdateFromSolutionOneDofCollapsed(double* solutiong,int enum_type);
     188                void    InputUpdateFromSolutionPrognostic(IssmDouble* solutiong);
     189                void    InputUpdateFromSolutionOneDof(IssmDouble* solutiong,int enum_type);
     190                void    InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solutiong,int enum_type);
    191191                bool      IsInput(int name);
    192192                bool      IsOnSurface(void);
    193193                bool      IsOnBed(void);
    194194                bool    IsFloating(void);
    195195                bool    IsNodeOnShelf();
    196                 bool    IsNodeOnShelfFromFlags(double* flags);
     196                bool    IsNodeOnShelfFromFlags(IssmDouble* flags);
    197197                bool    IsOnWater(void);
    198                 double  MinEdgeLength(double xyz_list[6][3]);
    199                 void      ReduceMatrixStokes(double* Ke_reduced, double* Ke_temp);
    200                 void      ReduceVectorStokes(double* Pe_reduced, double* Ke_temp, double* Pe_temp);
     198                IssmDouble  MinEdgeLength(IssmDouble xyz_list[6][3]);
     199                void      ReduceMatrixStokes(IssmDouble* Ke_reduced, IssmDouble* Ke_temp);
     200                void      ReduceVectorStokes(IssmDouble* Pe_reduced, IssmDouble* Ke_temp, IssmDouble* Pe_temp);
    201201                void      SetClone(int* minranks);
    202202                Tria*     SpawnTria(int g0, int g1, int g2);
    203                 void      SurfaceNormal(double* surface_normal, double xyz_list[3][3]);
     203                void      SurfaceNormal(IssmDouble* surface_normal, IssmDouble xyz_list[3][3]);
    204204
    205205                #ifdef _HAVE_DIAGNOSTIC_
    206206                ElementMatrix* CreateKMatrixCouplingMacAyealPattyn(void);
     
    235235                ElementMatrix* CreateJacobianDiagnosticMacayeal2d(void);
    236236                ElementMatrix* CreateJacobianDiagnosticPattyn(void);
    237237                ElementMatrix* CreateJacobianDiagnosticStokes(void);
    238                 void           InputUpdateFromSolutionDiagnosticHoriz( double* solutiong);
    239                 void           InputUpdateFromSolutionDiagnosticMacAyeal( double* solutiong);
    240                 void           InputUpdateFromSolutionDiagnosticMacAyealPattyn( double* solutiong);
    241                 void           InputUpdateFromSolutionDiagnosticMacAyealStokes( double* solutiong);
    242                 void           InputUpdateFromSolutionDiagnosticPattyn( double* solutiong);
    243                 void           InputUpdateFromSolutionDiagnosticPattynStokes( double* solutiong);
    244                 void           InputUpdateFromSolutionDiagnosticHutter( double* solutiong);
    245                 void           InputUpdateFromSolutionDiagnosticVert( double* solutiong);
    246                 void           InputUpdateFromSolutionDiagnosticStokes( double* solutiong);
     238                void           InputUpdateFromSolutionDiagnosticHoriz( IssmDouble* solutiong);
     239                void           InputUpdateFromSolutionDiagnosticMacAyeal( IssmDouble* solutiong);
     240                void           InputUpdateFromSolutionDiagnosticMacAyealPattyn( IssmDouble* solutiong);
     241                void           InputUpdateFromSolutionDiagnosticMacAyealStokes( IssmDouble* solutiong);
     242                void           InputUpdateFromSolutionDiagnosticPattyn( IssmDouble* solutiong);
     243                void           InputUpdateFromSolutionDiagnosticPattynStokes( IssmDouble* solutiong);
     244                void           InputUpdateFromSolutionDiagnosticHutter( IssmDouble* solutiong);
     245                void           InputUpdateFromSolutionDiagnosticVert( IssmDouble* solutiong);
     246                void           InputUpdateFromSolutionDiagnosticStokes( IssmDouble* solutiong);
    247247                void             GetSolutionFromInputsDiagnosticHoriz(Vector* solutiong);
    248248                void             GetSolutionFromInputsDiagnosticHutter(Vector* solutiong);
    249249                void             GetSolutionFromInputsDiagnosticStokes(Vector* solutiong);
     
    277277                ElementVector* CreatePVectorAdjointMacAyeal(void);
    278278                ElementVector* CreatePVectorAdjointPattyn(void);
    279279                ElementVector* CreatePVectorAdjointStokes(void);
    280                 void    InputUpdateFromSolutionAdjointHoriz( double* solutiong);
    281                 void    InputUpdateFromSolutionAdjointStokes( double* solutiong);
     280                void    InputUpdateFromSolutionAdjointHoriz( IssmDouble* solutiong);
     281                void    InputUpdateFromSolutionAdjointStokes( IssmDouble* solutiong);
    282282                #endif
    283283
    284284                #ifdef _HAVE_HYDROLOGY_
     
    302302                ElementVector* CreatePVectorThermalShelf(void);
    303303                ElementVector* CreatePVectorThermalSheet(void);
    304304                void           GetSolutionFromInputsThermal(Vector* solutiong);
    305                 void           InputUpdateFromSolutionThermal( double* solutiong);
    306                 void           InputUpdateFromSolutionEnthalpy( double* solutiong);
     305                void           InputUpdateFromSolutionThermal( IssmDouble* solutiong);
     306                void           InputUpdateFromSolutionEnthalpy( IssmDouble* solutiong);
    307307                #endif
    308308                #ifdef _HAVE_BALANCED_
    309309                ElementMatrix* CreateKMatrixBalancethickness(void);
  • u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/TriaRef.cpp

     
    5656
    5757/*Reference Element numerics*/
    5858/*FUNCTION TriaRef::GetBMacAyeal {{{*/
    59 void TriaRef::GetBMacAyeal(double* B, double* xyz_list, GaussTria* gauss){
     59void TriaRef::GetBMacAyeal(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){
    6060        /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
    6161         * For node i, Bi can be expressed in the actual coordinate system
    6262         * by:
     
    6969         */
    7070
    7171        int i;
    72         double dbasis[NDOF2][NUMNODES];
     72        IssmDouble dbasis[NDOF2][NUMNODES];
    7373
    7474        /*Get dh1dh2dh3 in actual coordinate system: */
    7575        GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss);
     
    8686}
    8787/*}}}*/
    8888/*FUNCTION TriaRef::GetBMacAyealStokes {{{*/
    89 void TriaRef::GetBMacAyealStokes(double* B, double* xyz_list, GaussTria* gauss){
     89void TriaRef::GetBMacAyealStokes(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){
    9090
    9191        /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
    9292         * For node i, Bi can be expressed in the actual coordinate system
     
    100100         */
    101101
    102102        /*Same thing in the actual coordinate system: */
    103         double dbasis[NDOF2][NUMNODES];
     103        IssmDouble dbasis[NDOF2][NUMNODES];
    104104
    105105        /*Get dh1dh2dh3 in actual coordinates system : */
    106106        GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss);
     
    117117}
    118118/*}}}*/
    119119/*FUNCTION TriaRef::GetSegmentBFlux{{{*/
    120 void TriaRef::GetSegmentBFlux(double* B,GaussTria* gauss, int index1,int index2){
     120void TriaRef::GetSegmentBFlux(IssmDouble* B,GaussTria* gauss, int index1,int index2){
    121121        /*Compute B  matrix. B=[phi1 phi2 -phi3 -phi4]
    122122         *
    123123         * and phi1=phi3 phi2=phi4
     
    125125         * We assume B has been allocated already, of size: 1x4
    126126         */
    127127
    128         double l1l3[NUMNODES];
     128        IssmDouble l1l3[NUMNODES];
    129129
    130130        GetNodalFunctions(&l1l3[0],gauss);
    131131
     
    136136}
    137137/*}}}*/
    138138/*FUNCTION TriaRef::GetSegmentBprimeFlux{{{*/
    139 void TriaRef::GetSegmentBprimeFlux(double* Bprime,GaussTria* gauss, int index1,int index2){
     139void TriaRef::GetSegmentBprimeFlux(IssmDouble* Bprime,GaussTria* gauss, int index1,int index2){
    140140        /*Compute Bprime  matrix. Bprime=[phi1 phi2 phi3 phi4]
    141141         *
    142142         * and phi1=phi3 phi2=phi4
     
    144144         * We assume Bprime has been allocated already, of size: 1x4
    145145         */
    146146
    147         double l1l3[NUMNODES];
     147        IssmDouble l1l3[NUMNODES];
    148148
    149149        GetNodalFunctions(&l1l3[0],gauss);
    150150
     
    155155}
    156156/*}}}*/
    157157/*FUNCTION TriaRef::GetBPrognostic{{{*/
    158 void TriaRef::GetBPrognostic(double* B_prog, double* xyz_list, GaussTria* gauss){
     158void TriaRef::GetBPrognostic(IssmDouble* B_prog, IssmDouble* xyz_list, GaussTria* gauss){
    159159        /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
    160160         * For node i, Bi can be expressed in the actual coordinate system
    161161         * by:
     
    166166         * We assume B_prog has been allocated already, of size: 2x(NDOF1*NUMNODES)
    167167         */
    168168
    169         double basis[NUMNODES];
     169        IssmDouble basis[NUMNODES];
    170170
    171171        /*Get dh1dh2dh3 in actual coordinate system: */
    172172        GetNodalFunctions(&basis[0],gauss);
     
    179179}
    180180/*}}}*/
    181181/*FUNCTION TriaRef::GetBprimeMacAyeal {{{*/
    182 void TriaRef::GetBprimeMacAyeal(double* Bprime, double* xyz_list, GaussTria* gauss){
     182void TriaRef::GetBprimeMacAyeal(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss){
    183183
    184184        /*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2.
    185185         * For node i, Bi' can be expressed in the actual coordinate system
     
    193193         */
    194194
    195195        /*Same thing in the actual coordinate system: */
    196         double dbasis[NDOF2][NUMNODES];
     196        IssmDouble dbasis[NDOF2][NUMNODES];
    197197
    198198        /*Get dh1dh2dh3 in actual coordinates system : */
    199199        GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss);
     
    210210}
    211211/*}}}*/
    212212/*FUNCTION TriaRef::GetBprimeMacAyealStokes {{{*/
    213 void TriaRef::GetBprimeMacAyealStokes(double* Bprime, double* xyz_list, GaussTria* gauss){
     213void TriaRef::GetBprimeMacAyealStokes(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss){
    214214
    215215        /*Compute Bprime  matrix. Bprime=[Bprime1 Bprime2 Bprime3] where Bprimei is of size 3*NDOF2.
    216216         * For node i, Bprimei can be expressed in the actual coordinate system
     
    225225         */
    226226
    227227        /*Same thing in the actual coordinate system: */
    228         double dbasis[NDOF2][NUMNODES];
     228        IssmDouble dbasis[NDOF2][NUMNODES];
    229229
    230230        /*Get dh1dh2dh3 in actual coordinates system : */
    231231        GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss);
     
    244244}
    245245/*}}}*/
    246246/*FUNCTION TriaRef::GetBprimePrognostic{{{*/
    247 void TriaRef::GetBprimePrognostic(double* Bprime_prog, double* xyz_list, GaussTria* gauss){
     247void TriaRef::GetBprimePrognostic(IssmDouble* Bprime_prog, IssmDouble* xyz_list, GaussTria* gauss){
    248248        /*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2.
    249249         * For node i, Bi' can be expressed in the actual coordinate system
    250250         * by:
     
    256256         */
    257257
    258258        /*Same thing in the actual coordinate system: */
    259         double dbasis[NDOF2][NUMNODES];
     259        IssmDouble dbasis[NDOF2][NUMNODES];
    260260
    261261        /*Get dh1dh2dh3 in actual coordinates system : */
    262262        GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss);
     
    269269}
    270270/*}}}*/
    271271/*FUNCTION TriaRef::GetL{{{*/
    272 void TriaRef::GetL(double* L, double* xyz_list,GaussTria* gauss,int numdof){
     272void TriaRef::GetL(IssmDouble* L, IssmDouble* xyz_list,GaussTria* gauss,int numdof){
    273273        /*Compute L  matrix. L=[L1 L2 L3] where Li is square and of size numdof.
    274274         * For node i, Li can be expressed in the actual coordinate system
    275275         * by:
     
    284284         */
    285285
    286286        int i;
    287         double basis[3];
     287        IssmDouble basis[3];
    288288
    289289        /*Get basis in actual coordinate system: */
    290290        GetNodalFunctions(basis,gauss);
     
    306306}
    307307/*}}}*/
    308308/*FUNCTION TriaRef::GetJacobian{{{*/
    309 void TriaRef::GetJacobian(double* J, double* xyz_list,GaussTria* gauss){
     309void TriaRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussTria* gauss){
    310310        /*The Jacobian is constant over the element, discard the gaussian points.
    311311         * J is assumed to have been allocated of size NDOF2xNDOF2.*/
    312         double x1,y1,x2,y2,x3,y3;
     312        IssmDouble x1,y1,x2,y2,x3,y3;
    313313
    314314        x1=*(xyz_list+NUMNODES*0+0);
    315315        y1=*(xyz_list+NUMNODES*0+1);
     
    326326}
    327327/*}}}*/
    328328/*FUNCTION TriaRef::GetSegmentJacobianDeterminant{{{*/
    329 void TriaRef::GetSegmentJacobianDeterminant(double* Jdet, double* xyz_list,GaussTria* gauss){
     329void TriaRef::GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss){
    330330        /*The Jacobian determinant is constant over the element, discard the gaussian points.
    331331         * J is assumed to have been allocated*/
    332         double x1,y1,x2,y2;
     332        IssmDouble x1,y1,x2,y2;
    333333
    334334        x1=*(xyz_list+3*0+0);
    335335        y1=*(xyz_list+3*0+1);
     
    342342}
    343343/*}}}*/
    344344/*FUNCTION TriaRef::GetJacobianDeterminant2d{{{*/
    345 void TriaRef::GetJacobianDeterminant2d(double* Jdet, double* xyz_list,GaussTria* gauss){
     345void TriaRef::GetJacobianDeterminant2d(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss){
    346346        /*The Jacobian determinant is constant over the element, discard the gaussian points.
    347347         * J is assumed to have been allocated of size NDOF2xNDOF2.*/
    348         double J[2][2];
     348        IssmDouble J[2][2];
    349349
    350350        /*Get Jacobian*/
    351351        GetJacobian(&J[0][0],xyz_list,gauss);
     
    357357}
    358358/*}}}*/
    359359/*FUNCTION TriaRef::GetJacobianDeterminant3d {{{*/
    360 void TriaRef::GetJacobianDeterminant3d(double*  Jdet, double* xyz_list,GaussTria* gauss){
     360void TriaRef::GetJacobianDeterminant3d(IssmDouble*  Jdet, IssmDouble* xyz_list,GaussTria* gauss){
    361361        /*The Jacobian determinant is constant over the element, discard the gaussian points.
    362362         * J is assumed to have been allocated of size NDOF2xNDOF2.*/
    363363
    364         double x1,x2,x3,y1,y2,y3,z1,z2,z3;
     364        IssmDouble x1,x2,x3,y1,y2,y3,z1,z2,z3;
    365365
    366366        x1=*(xyz_list+3*0+0);
    367367        y1=*(xyz_list+3*0+1);
     
    379379}
    380380/*}}}*/
    381381/*FUNCTION TriaRef::GetJacobianInvert{{{*/
    382 void TriaRef::GetJacobianInvert(double*  Jinv, double* xyz_list,GaussTria* gauss){
     382void TriaRef::GetJacobianInvert(IssmDouble*  Jinv, IssmDouble* xyz_list,GaussTria* gauss){
    383383
    384384        /*Jacobian*/
    385         double J[2][2];
     385        IssmDouble J[2][2];
    386386
    387387        /*Call Jacobian routine to get the jacobian:*/
    388388        GetJacobian(&J[0][0], xyz_list, gauss);
     
    393393}
    394394/*}}}*/
    395395/*FUNCTION TriaRef::GetNodalFunctions{{{*/
    396 void TriaRef::GetNodalFunctions(double* basis,GaussTria* gauss){
     396void TriaRef::GetNodalFunctions(IssmDouble* basis,GaussTria* gauss){
    397397        /*This routine returns the values of the nodal functions  at the gaussian point.*/
    398398
    399399        basis[0]=gauss->coord1;
     
    403403}
    404404/*}}}*/
    405405/*FUNCTION TriaRef::GetSegmentNodalFunctions{{{*/
    406 void TriaRef::GetSegmentNodalFunctions(double* basis,GaussTria* gauss,int index1,int index2){
     406void TriaRef::GetSegmentNodalFunctions(IssmDouble* basis,GaussTria* gauss,int index1,int index2){
    407407        /*This routine returns the values of the nodal functions  at the gaussian point.*/
    408408
    409         double BasisFunctions[3];
     409        IssmDouble BasisFunctions[3];
    410410
    411411        GetNodalFunctions(&BasisFunctions[0],gauss);
    412412
     
    417417}
    418418/*}}}*/
    419419/*FUNCTION TriaRef::GetNodalFunctionsDerivatives{{{*/
    420 void TriaRef::GetNodalFunctionsDerivatives(double* dbasis,double* xyz_list, GaussTria* gauss){
     420void TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTria* gauss){
    421421
    422422        /*This routine returns the values of the nodal functions derivatives  (with respect to the
    423423         * actual coordinate system): */
    424424        int       i;
    425         double    dbasis_ref[NDOF2][NUMNODES];
    426         double    Jinv[NDOF2][NDOF2];
     425        IssmDouble    dbasis_ref[NDOF2][NUMNODES];
     426        IssmDouble    Jinv[NDOF2][NDOF2];
    427427
    428428        /*Get derivative values with respect to parametric coordinate system: */
    429429        GetNodalFunctionsDerivativesReference(&dbasis_ref[0][0], gauss);
     
    444444}
    445445/*}}}*/
    446446/*FUNCTION TriaRef::GetNodalFunctionsDerivativesReference{{{*/
    447 void TriaRef::GetNodalFunctionsDerivativesReference(double* dl1dl3,GaussTria* gauss){
     447void TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dl1dl3,GaussTria* gauss){
    448448        /*This routine returns the values of the nodal functions derivatives  (with respect to the
    449449         * natural coordinate system) at the gaussian point. */
    450450
     
    463463}
    464464/*}}}*/
    465465/*FUNCTION TriaRef::GetInputDerivativeValue{{{*/
    466 void TriaRef::GetInputDerivativeValue(double* p, double* plist,double* xyz_list, GaussTria* gauss){
     466void TriaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussTria* gauss){
    467467
    468468        /*From node values of parameter p (plist[0],plist[1],plist[2]), return parameter derivative value at gaussian
    469469         * point specified by gauss_basis:
     
    474474         */
    475475
    476476        /*Nodal Derivatives*/
    477         double dbasis[2][3]; //nodal derivative functions in actual coordinate system.
     477        IssmDouble dbasis[2][3]; //nodal derivative functions in actual coordinate system.
    478478
    479479        /*Get dh1dh2dh3 in actual coordinate system: */
    480480        GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list, gauss);
     
    486486}
    487487/*}}}*/
    488488/*FUNCTION TriaRef::GetInputValue{{{*/
    489 void TriaRef::GetInputValue(double* p, double* plist, GaussTria* gauss){
     489void TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, GaussTria* gauss){
    490490
    491491        /*From node values of parameter p (plist[0],plist[1],plist[2]), return parameter value at gaussian
    492492         * point specifie by gauss: */
    493493
    494494        /*nodal functions annd output: */
    495         double basis[3];
     495        IssmDouble basis[3];
    496496
    497497        /*Get nodal functions*/
    498498        GetNodalFunctions(basis, gauss);
Note: See TracBrowser for help on using the repository browser.