source:
issm/oecreview/Archive/12321-12677/ISSM-12470-12471.diff
Last change on this file was 12679, checked in by , 13 years ago | |
---|---|
File size: 240.0 KB |
-
u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/Element.h
37 37 virtual int Sid()=0; 38 38 virtual bool IsFloating()=0; 39 39 virtual bool IsNodeOnShelf()=0; 40 virtual bool IsNodeOnShelfFromFlags( double* flags)=0;40 virtual bool IsNodeOnShelfFromFlags(IssmDouble* flags)=0; 41 41 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; 45 45 46 virtual double SurfaceArea(void)=0;46 virtual IssmDouble SurfaceArea(void)=0; 47 47 virtual void InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum)=0; 48 48 virtual void ComputeBasalStress(Vector* sigma_b)=0; 49 49 virtual void ComputeStrainRate(Vector* eps)=0; 50 50 virtual void PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes)=0; 51 51 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; 53 53 virtual void DeleteResults(void)=0; 54 54 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; 56 56 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; 59 59 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; 61 61 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; 64 64 virtual void GetVectorFromInputs(Vector* vector, int name_enum)=0; 65 65 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; 69 69 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; 72 72 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; 75 75 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; 77 77 78 78 #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; 93 93 #endif 94 94 95 95 #ifdef _HAVE_CONTROL_ 96 96 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; 106 106 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; 109 109 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; 112 112 #endif 113 113 }; 114 114 #endif -
u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/Tria.cpp
124 124 125 125 /*Other*/ 126 126 /*FUNCTION Tria::AverageOntoPartition {{{*/ 127 void Tria::AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas, double* vertex_response,double* qmu_part){127 void Tria::AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){ 128 128 129 129 bool already=false; 130 130 int i,j; 131 131 int partition[NUMVERTICES]; 132 132 int offsetsid[NUMVERTICES]; 133 133 int offsetdof[NUMVERTICES]; 134 double area;135 double mean;136 double values[3];134 IssmDouble area; 135 IssmDouble mean; 136 IssmDouble values[3]; 137 137 138 138 /*First, get the area: */ 139 139 area=this->GetArea(); … … 231 231 232 232 /*Intermediaries */ 233 233 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]; 238 238 GaussTria *gauss=NULL; 239 239 240 240 /*Initialize Element matrix*/ … … 290 290 /*Intermediaries */ 291 291 int stabilization; 292 292 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}; 305 305 GaussTria *gauss=NULL; 306 306 307 307 /*Initialize Element matrix*/ … … 409 409 410 410 /*Intermediaries */ 411 411 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; 420 420 GaussTria *gauss=NULL; 421 421 422 422 /*Initialize Element matrix*/ … … 484 484 485 485 /* Intermediaries */ 486 486 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]; 490 490 GaussTria *gauss = NULL; 491 491 492 492 /*Initialize Element matrix*/ … … 598 598 599 599 /*Intermediaries */ 600 600 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]; 605 605 GaussTria* gauss=NULL; 606 606 607 607 /*Initialize Element vector*/ … … 649 649 650 650 /*Intermediaries */ 651 651 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]; 656 656 GaussTria* gauss=NULL; 657 657 658 658 /*Initialize Element vector*/ … … 695 695 /*Intermediaries */ 696 696 int i,j,ig; 697 697 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]; 702 702 GaussTria* gauss=NULL; 703 703 704 704 /*Initialize Element vector*/ … … 786 786 void Tria::ComputeStressTensor(){ 787 787 788 788 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}; 798 798 GaussTria* gauss=NULL; 799 799 800 800 /* Get node coordinates and dof list: */ … … 947 947 } 948 948 /*}}}*/ 949 949 /*FUNCTION Tria::GetArea {{{*/ 950 double Tria::GetArea(void){950 IssmDouble Tria::GetArea(void){ 951 951 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; 955 955 956 956 /*Get xyz list: */ 957 957 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); … … 1021 1021 _error_("Node provided not found among element nodes"); 1022 1022 } 1023 1023 /*}}}*/ 1024 /*FUNCTION Tria::GetInputListOnVertices( double* pvalue,int enumtype) {{{*/1025 void Tria::GetInputListOnVertices( double* pvalue,int enumtype){1024 /*FUNCTION Tria::GetInputListOnVertices(IssmDouble* pvalue,int enumtype) {{{*/ 1025 void Tria::GetInputListOnVertices(IssmDouble* pvalue,int enumtype){ 1026 1026 1027 1027 /*Intermediaries*/ 1028 double value[NUMVERTICES];1028 IssmDouble value[NUMVERTICES]; 1029 1029 GaussTria *gauss = NULL; 1030 1030 1031 1031 /*Recover input*/ … … 1046 1046 delete gauss; 1047 1047 } 1048 1048 /*}}}*/ 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) {{{*/ 1050 void Tria::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue){ 1051 1051 1052 double value[NUMVERTICES];1052 IssmDouble value[NUMVERTICES]; 1053 1053 GaussTria *gauss = NULL; 1054 1054 Input *input = inputs->GetInput(enumtype); 1055 1055 … … 1072 1072 delete gauss; 1073 1073 } 1074 1074 /*}}}*/ 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{{{*/ 1076 void Tria::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue,int index){ 1077 1077 1078 double value[NUMVERTICES];1078 IssmDouble value[NUMVERTICES]; 1079 1079 GaussTria *gauss = NULL; 1080 1080 Input *input = inputs->GetInput(enumtype); 1081 1081 … … 1098 1098 delete gauss; 1099 1099 } 1100 1100 /*}}}*/ 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) {{{*/ 1102 void Tria::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){ 1103 1103 1104 1104 Input* input=inputs->GetInput(enumtype); 1105 1105 if(!input) _error_("No input of type %s found in tria",EnumToStringx(enumtype)); … … 1149 1149 1150 1150 } 1151 1151 /*}}}*/ 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){{{*/ 1153 void Tria::GetStrainRate2d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussTria* gauss, Input* vx_input, Input* vy_input){ 1154 1154 /*Compute the 2d Strain Rate (3 components): 1155 1155 * epsilon=[exx eyy exy] */ 1156 1156 1157 1157 int i; 1158 double epsilonvx[3];1159 double epsilonvy[3];1158 IssmDouble epsilonvx[3]; 1159 IssmDouble epsilonvy[3]; 1160 1160 1161 1161 /*Check that both inputs have been found*/ 1162 1162 if (!vx_input || !vy_input){ … … 1225 1225 } 1226 1226 /*}}}*/ 1227 1227 /*FUNCTION Tria::InputArtificialNoise{{{*/ 1228 void Tria::InputArtificialNoise(int enum_type, double min,double max){1228 void Tria::InputArtificialNoise(int enum_type,IssmDouble min,IssmDouble max){ 1229 1229 1230 1230 Input* input=NULL; 1231 1231 … … 1238 1238 } 1239 1239 /*}}}*/ 1240 1240 /*FUNCTION Tria::InputConvergence{{{*/ 1241 bool Tria::InputConvergence( double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums){1241 bool Tria::InputConvergence(IssmDouble* eps, int* enums,int num_enums,int* criterionenums,IssmDouble* criterionvalues,int num_criterionenums){ 1242 1242 1243 1243 bool converged=true; 1244 1244 int i; … … 1305 1305 } 1306 1306 /*}}}*/ 1307 1307 /*FUNCTION Tria::InputScale{{{*/ 1308 void Tria::InputScale(int enum_type, double scale_factor){1308 void Tria::InputScale(int enum_type,IssmDouble scale_factor){ 1309 1309 1310 1310 Input* input=NULL; 1311 1311 … … 1318 1318 } 1319 1319 /*}}}*/ 1320 1320 /*FUNCTION Tria::InputToResult{{{*/ 1321 void Tria::InputToResult(int enum_type,int step, double time){1321 void Tria::InputToResult(int enum_type,int step,IssmDouble time){ 1322 1322 1323 1323 int i; 1324 1324 Input *input = NULL; … … 1349 1349 this->inputs->AddInput(new IntInput(name,constant)); 1350 1350 } 1351 1351 /*}}}*/ 1352 /*FUNCTION Tria::InputUpdateFromConstant( double value, int name);{{{*/1353 void Tria::InputUpdateFromConstant( double constant, int name){1352 /*FUNCTION Tria::InputUpdateFromConstant(IssmDouble value, int name);{{{*/ 1353 void Tria::InputUpdateFromConstant(IssmDouble constant, int name){ 1354 1354 /*Check that name is an element input*/ 1355 1355 if (!IsInput(name)) return; 1356 1356 … … 1373 1373 /*Intermediaries*/ 1374 1374 int i,j; 1375 1375 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]; 1379 1379 bool control_analysis=false; 1380 1380 int num_control_type; 1381 double yts;1381 IssmDouble yts; 1382 1382 int num_cm_responses; 1383 1383 1384 1384 /*Get parameters: */ … … 1454 1454 } 1455 1455 /*}}}*/ 1456 1456 /*FUNCTION Tria::InputUpdateFromSolution {{{*/ 1457 void Tria::InputUpdateFromSolution( double* solution){1457 void Tria::InputUpdateFromSolution(IssmDouble* solution){ 1458 1458 1459 1459 /*retrive parameters: */ 1460 1460 int analysis_type; … … 1509 1509 } 1510 1510 /*}}}*/ 1511 1511 /*FUNCTION Tria::InputUpdateFromSolutionOneDof{{{*/ 1512 void Tria::InputUpdateFromSolutionOneDof( double* solution,int enum_type){1512 void Tria::InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type){ 1513 1513 1514 1514 const int numdof = NDOF1*NUMVERTICES; 1515 1515 1516 1516 int* doflist=NULL; 1517 double values[numdof];1517 IssmDouble values[numdof]; 1518 1518 1519 1519 /*Get dof list: */ 1520 1520 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); … … 1533 1533 } 1534 1534 /*}}}*/ 1535 1535 /*FUNCTION Tria::InputUpdateFromSolutionPrognostic{{{*/ 1536 void Tria::InputUpdateFromSolutionPrognostic( double* solution){1536 void Tria::InputUpdateFromSolutionPrognostic(IssmDouble* solution){ 1537 1537 1538 1538 /*Intermediaries*/ 1539 1539 const int numdof = NDOF1*NUMVERTICES; 1540 1540 1541 1541 int i,hydroadjustment; 1542 1542 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]; 1550 1550 1551 1551 /*Get dof list: */ 1552 1552 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); … … 1599 1599 xDelete<int>(doflist); 1600 1600 } 1601 1601 /*}}}*/ 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);{{{*/ 1603 void Tria::InputUpdateFromVector(IssmDouble* vector, int name, int type){ 1604 1604 1605 1605 /*Check that name is an element input*/ 1606 1606 if (!IsInput(name)) return; … … 1610 1610 case VertexEnum: 1611 1611 1612 1612 /*New TriaP1Input*/ 1613 double values[3];1613 IssmDouble values[3]; 1614 1614 1615 1615 /*Get values on the 3 vertices*/ 1616 1616 for (int i=0;i<3;i++){ … … 1641 1641 _error_(" not supported yet!"); 1642 1642 } 1643 1643 /*}}}*/ 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);{{{*/ 1645 void Tria::InputCreate(IssmDouble scalar,int name,int code){ 1646 1646 1647 1647 /*Check that name is an element input*/ 1648 1648 if (!IsInput(name)) return; … … 1653 1653 else if ((code==6) || (code==2)){ //integer 1654 1654 this->inputs->AddInput(new IntInput(name,(int)scalar)); 1655 1655 } 1656 else if ((code==7) || (code==3)){ // double1656 else if ((code==7) || (code==3)){ //IssmDouble 1657 1657 this->inputs->AddInput(new DoubleInput(name,(int)scalar)); 1658 1658 } 1659 1659 else _error_("%s%i"," could not recognize nature of vector from code ",code); 1660 1660 1661 1661 } 1662 1662 /*}}}*/ 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 elements1663 /*FUNCTION Tria::InputCreate(IssmDouble* vector,int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){{{*/ 1664 void Tria::InputCreate(IssmDouble* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){//index into elements 1665 1665 1666 1666 /*Intermediaries*/ 1667 1667 int i,j,t; 1668 1668 int tria_vertex_ids[3]; 1669 1669 int row; 1670 double nodeinputs[3];1671 double time;1670 IssmDouble nodeinputs[3]; 1671 IssmDouble time; 1672 1672 TransientInput* transientinput=NULL; 1673 1673 int numberofvertices; 1674 1674 int numberofelements; 1675 double yts;1675 IssmDouble yts; 1676 1676 1677 1677 1678 1678 /*Fetch parameters: */ … … 1692 1692 if(M==numberofvertices){ 1693 1693 1694 1694 /*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]; 1696 1696 1697 1697 /*process units: */ 1698 1698 UnitConversion(&nodeinputs[0], 3 ,ExtToIuEnum, vector_enum); … … 1707 1707 /*create input values: */ 1708 1708 for(i=0;i<3;i++){ 1709 1709 row=tria_vertex_ids[i]-1; 1710 nodeinputs[i]=( double)vector[N*row+t];1710 nodeinputs[i]=(IssmDouble)vector[N*row+t]; 1711 1711 } 1712 1712 1713 1713 /*process units: */ 1714 1714 UnitConversion(&nodeinputs[0], 3 ,ExtToIuEnum, vector_enum); 1715 1715 1716 1716 /*time? :*/ 1717 time=( double)vector[(M-1)*N+t]*yts;1717 time=(IssmDouble)vector[(M-1)*N+t]*yts; 1718 1718 1719 1719 if(t==0) transientinput=new TransientInput(vector_enum); 1720 1720 transientinput->AddTimeInput(new TriaP1Input(vector_enum,nodeinputs),time); … … 1735 1735 else if (code==6){ //integer 1736 1736 this->inputs->AddInput(new IntInput(vector_enum,(int)vector[index])); 1737 1737 } 1738 else if (code==7){ // double1739 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])); 1740 1740 } 1741 1741 else _error_("%s%i"," could not recognize nature of vector from code ",code); 1742 1742 } … … 1816 1816 } 1817 1817 /*}}}*/ 1818 1818 /*FUNCTION Tria::IsNodeOnShelfFromFlags {{{*/ 1819 bool Tria::IsNodeOnShelfFromFlags( double* flags){1819 bool Tria::IsNodeOnShelfFromFlags(IssmDouble* flags){ 1820 1820 1821 1821 int i; 1822 1822 bool shelf=false; … … 1839 1839 } 1840 1840 /*}}}*/ 1841 1841 /*FUNCTION Tria::ListResultsInfo{{{*/ 1842 void Tria::ListResultsInfo(int** in_resultsenums,int** in_resultssizes, double** in_resultstimes,int** in_resultssteps,int* in_num_results){1842 void Tria::ListResultsInfo(int** in_resultsenums,int** in_resultssizes,IssmDouble** in_resultstimes,int** in_resultssteps,int* in_num_results){ 1843 1843 1844 1844 /*Intermediaries*/ 1845 1845 int i; 1846 1846 int numberofresults = 0; 1847 1847 int *resultsenums = NULL; 1848 1848 int *resultssizes = NULL; 1849 double *resultstimes = NULL;1849 IssmDouble *resultstimes = NULL; 1850 1850 int *resultssteps = NULL; 1851 1851 1852 1852 /*Checks*/ … … 1863 1863 /*Allocate output*/ 1864 1864 resultsenums=xNew<int>(numberofresults); 1865 1865 resultssizes=xNew<int>(numberofresults); 1866 resultstimes=xNew< double>(numberofresults);1866 resultstimes=xNew<IssmDouble>(numberofresults); 1867 1867 resultssteps=xNew<int>(numberofresults); 1868 1868 1869 1869 /*populate enums*/ … … 1890 1890 1891 1891 }/*}}}*/ 1892 1892 /*FUNCTION Tria::MigrateGroundingLine{{{*/ 1893 void Tria::MigrateGroundingLine( double* old_floating_ice,double* sheet_ungrounding){1893 void Tria::MigrateGroundingLine(IssmDouble* old_floating_ice,IssmDouble* sheet_ungrounding){ 1894 1894 1895 1895 int i,migration_style,unground; 1896 1896 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]; 1901 1901 1902 1902 /*Recover info at the vertices: */ 1903 1903 parameters->FindParam(&migration_style,GroundinglineMigrationEnum); … … 1972 1972 } 1973 1973 /*}}}*/ 1974 1974 /*FUNCTION Tria::NodalValue {{{*/ 1975 int Tria::NodalValue( double* pvalue, int index, int natureofdataenum,bool process_units){1975 int Tria::NodalValue(IssmDouble* pvalue, int index, int natureofdataenum,bool process_units){ 1976 1976 1977 1977 int i; 1978 1978 int found=0; 1979 double value;1979 IssmDouble value; 1980 1980 Input* data=NULL; 1981 1981 GaussTria *gauss = NULL; 1982 1982 … … 2057 2057 void Tria::PotentialSheetUngrounding(Vector* potential_sheet_ungrounding){ 2058 2058 2059 2059 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; 2063 2063 bool elementonshelf = false; 2064 2064 2065 2065 /*material parameters: */ … … 2083 2083 } 2084 2084 /*}}}*/ 2085 2085 /*FUNCTION Tria::PositiveDegreeDay{{{*/ 2086 void Tria::PositiveDegreeDay( double* pdds,double* pds,double signorm){2086 void Tria::PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){ 2087 2087 2088 2088 int i,iqj,imonth; 2089 double agd[NUMVERTICES]; // surface mass balance2090 double saccu[NUMVERTICES] = {0}; // yearly surface accumulation2091 double smelt[NUMVERTICES] = {0}; // yearly melt2092 double precrunoff[NUMVERTICES]; // yearly runoff2093 double prect; // total precipitation during 1 year taking into account des. ef.2094 double water; //water=rain + snowmelt2095 double runoff; //meltwater only, does not include rain2096 double sconv; //rhow_rain/rhoi / 12 months2089 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 2097 2097 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 paper2100 double desfac = 0.5; // desert elevation factor2101 double s0p[NUMVERTICES]={0}; // should be set to elevation from precip source2102 double s0t[NUMVERTICES]={0}; // should be set to elevation from temperature source2103 double st; // elevation between altitude of the temp record and current altitude2104 double sp; // elevation between altitude of the prec record and current altitude2098 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 2105 2105 2106 2106 // PDD and PD constants and variables 2107 double siglim; // sigma limit for the integration which is equal to 2.5 sigmanorm2108 double signormc = signorm - 0.5; // sigma of the temperature distribution for cloudy day2109 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 snow2107 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 2113 2113 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 precipitation2116 double qmt[NUMVERTICES] = {0}; // precipitation without desertification effect adjustment2117 double qmp[NUMVERTICES] = {0}; // desertification taken into account2118 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}; 2120 2120 2121 double tstar; // monthly mean surface temp2122 double Tsum[NUMVERTICES]= {0}; // average summer (JJA) temperature2123 double Tsurf[NUMVERTICES] = {0}; // average annual temperature2121 IssmDouble tstar; // monthly mean surface temp 2122 IssmDouble Tsum[NUMVERTICES]= {0}; // average summer (JJA) temperature 2123 IssmDouble Tsurf[NUMVERTICES] = {0}; // average annual temperature 2124 2124 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; 2128 2128 int ismon[12]={12,1,2,3,4,5,6,7,8,9,10,11}; 2129 2129 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). 2133 2133 2134 double dfrz=1.5, CovrLm=2009./3.35e+5, dCovrLm=dfrz*CovrLm; //m*J kg^-1 C^-1 /(J kg^-1)=m/C yr2135 double supice,supcap,diffndd;2136 double fsupT=0.5, fsupndd=0.5; // Tsurf mode factors for supice2137 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; 2138 2138 2139 2139 /*Recover info at the vertices: */ 2140 2140 GetInputListOnVertices(&h[0],ThicknessEnum); … … 2145 2145 /*Recover monthly temperatures*/ 2146 2146 Input* input=inputs->GetInput(SurfaceforcingsMonthlytemperaturesEnum); _assert_(input); 2147 2147 GaussTria* gauss=new GaussTria(); 2148 double time,yts;2148 IssmDouble time,yts; 2149 2149 this->parameters->FindParam(&time,TimeEnum); 2150 2150 this->parameters->FindParam(&yts,ConstantsYtsEnum); 2151 2151 for(int month=0;month<12;month++){ … … 2329 2329 } 2330 2330 /*}}}*/ 2331 2331 /*FUNCTION Tria::RequestedOutput{{{*/ 2332 void Tria::RequestedOutput(int output_enum,int step, double time){2332 void Tria::RequestedOutput(int output_enum,int step,IssmDouble time){ 2333 2333 2334 2334 if(IsInput(output_enum)){ 2335 2335 /*just transfer this input to results, and we are done: */ … … 2363 2363 } 2364 2364 /*}}}*/ 2365 2365 /*FUNCTION Tria::SmearFunction {{{*/ 2366 void Tria::SmearFunction(Vector* smearedvector, double (*WeightFunction)(double distance,double radius),double radius){2366 void Tria::SmearFunction(Vector* smearedvector,IssmDouble (*WeightFunction)(IssmDouble distance,IssmDouble radius),IssmDouble radius){ 2367 2367 _error_("not implemented yet"); 2368 2368 2369 2369 } … … 2385 2385 } 2386 2386 /*}}}*/ 2387 2387 /*FUNCTION Tria::SurfaceArea {{{*/ 2388 double Tria::SurfaceArea(void){2388 IssmDouble Tria::SurfaceArea(void){ 2389 2389 2390 2390 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]; 2395 2395 2396 2396 /*If on water, return 0: */ 2397 2397 if(IsOnWater())return 0; … … 2407 2407 normal[1]=v13[2]*v23[0]-v13[0]*v23[2]; 2408 2408 normal[2]=v13[0]*v23[1]-v13[1]*v23[0]; 2409 2409 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)); 2411 2411 2412 2412 /*Return: */ 2413 2413 return S; 2414 2414 } 2415 2415 /*}}}*/ 2416 2416 /*FUNCTION Tria::SurfaceNormal{{{*/ 2417 void Tria::SurfaceNormal( double* surface_normal, double xyz_list[3][3]){2417 void Tria::SurfaceNormal(IssmDouble* surface_normal, IssmDouble xyz_list[3][3]){ 2418 2418 2419 2419 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; 2423 2423 2424 2424 for (i=0;i<3;i++){ 2425 2425 v13[i]=xyz_list[0][i]-xyz_list[2][i]; … … 2430 2430 normal[1]=v13[2]*v23[0]-v13[0]*v23[2]; 2431 2431 normal[2]=v13[0]*v23[1]-v13[1]*v23[0]; 2432 2432 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) ); 2434 2434 2435 2435 *(surface_normal)=normal[0]/normal_norm; 2436 2436 *(surface_normal+1)=normal[1]/normal_norm; … … 2438 2438 } 2439 2439 /*}}}*/ 2440 2440 /*FUNCTION Tria::TimeAdapt{{{*/ 2441 double Tria::TimeAdapt(void){2441 IssmDouble Tria::TimeAdapt(void){ 2442 2442 2443 2443 /*intermediary: */ 2444 2444 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]; 2451 2451 2452 2452 /*get CFL coefficient:*/ 2453 2453 this->parameters->FindParam(&C,TimesteppingCflCoefficientEnum); … … 2491 2491 int tria_node_ids[3]; 2492 2492 int tria_vertex_ids[3]; 2493 2493 int tria_type; 2494 double nodeinputs[3];2495 double yts;2494 IssmDouble nodeinputs[3]; 2495 IssmDouble yts; 2496 2496 int progstabilization,balancestabilization; 2497 2497 bool dakota_analysis; 2498 2498 … … 2584 2584 } 2585 2585 /*}}}*/ 2586 2586 /*FUNCTION Tria::UpdatePotentialSheetUngrounding{{{*/ 2587 int Tria::UpdatePotentialSheetUngrounding( double* vertices_potentially_ungrounding,Vector* vec_nodes_on_iceshelf,double* nodes_on_iceshelf){2587 int Tria::UpdatePotentialSheetUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){ 2588 2588 2589 2589 int i; 2590 2590 int nflipped=0; … … 2606 2606 2607 2607 #ifdef _HAVE_RESPONSES_ 2608 2608 /*FUNCTION Tria::IceVolume {{{*/ 2609 double Tria::IceVolume(void){2609 IssmDouble Tria::IceVolume(void){ 2610 2610 2611 2611 /*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]; 2614 2614 2615 2615 if(IsOnWater())return 0; 2616 2616 … … 2632 2632 } 2633 2633 /*}}}*/ 2634 2634 /*FUNCTION Tria::MassFlux {{{*/ 2635 double Tria::MassFlux( double* segment,bool process_units){2635 IssmDouble Tria::MassFlux( IssmDouble* segment,bool process_units){ 2636 2636 2637 2637 const int numdofs=2; 2638 2638 2639 2639 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; 2646 2646 GaussTria* gauss_1=NULL; 2647 2647 GaussTria* gauss_2=NULL; 2648 2648 … … 2704 2704 } 2705 2705 /*}}}*/ 2706 2706 /*FUNCTION Tria::MaxAbsVx{{{*/ 2707 void Tria::MaxAbsVx( double* pmaxabsvx, bool process_units){2707 void Tria::MaxAbsVx(IssmDouble* pmaxabsvx, bool process_units){ 2708 2708 2709 2709 /*Get maximum:*/ 2710 double maxabsvx=this->inputs->MaxAbs(VxEnum);2710 IssmDouble maxabsvx=this->inputs->MaxAbs(VxEnum); 2711 2711 2712 2712 /*process units if requested: */ 2713 2713 if(process_units) maxabsvx=UnitConversion(maxabsvx,IuToExtEnum,VxEnum); … … 2717 2717 } 2718 2718 /*}}}*/ 2719 2719 /*FUNCTION Tria::MaxAbsVy{{{*/ 2720 void Tria::MaxAbsVy( double* pmaxabsvy, bool process_units){2720 void Tria::MaxAbsVy(IssmDouble* pmaxabsvy, bool process_units){ 2721 2721 2722 2722 /*Get maximum:*/ 2723 double maxabsvy=this->inputs->MaxAbs(VyEnum);2723 IssmDouble maxabsvy=this->inputs->MaxAbs(VyEnum); 2724 2724 2725 2725 /*process units if requested: */ 2726 2726 if(process_units) maxabsvy=UnitConversion(maxabsvy,IuToExtEnum,VyEnum); … … 2730 2730 } 2731 2731 /*}}}*/ 2732 2732 /*FUNCTION Tria::MaxAbsVz{{{*/ 2733 void Tria::MaxAbsVz( double* pmaxabsvz, bool process_units){2733 void Tria::MaxAbsVz(IssmDouble* pmaxabsvz, bool process_units){ 2734 2734 2735 2735 /*Get maximum:*/ 2736 double maxabsvz=this->inputs->MaxAbs(VzEnum);2736 IssmDouble maxabsvz=this->inputs->MaxAbs(VzEnum); 2737 2737 2738 2738 /*process units if requested: */ 2739 2739 if(process_units) maxabsvz=UnitConversion(maxabsvz,IuToExtEnum,VyEnum); … … 2743 2743 } 2744 2744 /*}}}*/ 2745 2745 /*FUNCTION Tria::MaxVel{{{*/ 2746 void Tria::MaxVel( double* pmaxvel, bool process_units){2746 void Tria::MaxVel(IssmDouble* pmaxvel, bool process_units){ 2747 2747 2748 2748 /*Get maximum:*/ 2749 double maxvel=this->inputs->Max(VelEnum);2749 IssmDouble maxvel=this->inputs->Max(VelEnum); 2750 2750 2751 2751 /*process units if requested: */ 2752 2752 if(process_units) maxvel=UnitConversion(maxvel,IuToExtEnum,VelEnum); … … 2756 2756 } 2757 2757 /*}}}*/ 2758 2758 /*FUNCTION Tria::MaxVx{{{*/ 2759 void Tria::MaxVx( double* pmaxvx, bool process_units){2759 void Tria::MaxVx(IssmDouble* pmaxvx, bool process_units){ 2760 2760 2761 2761 /*Get maximum:*/ 2762 double maxvx=this->inputs->Max(VxEnum);2762 IssmDouble maxvx=this->inputs->Max(VxEnum); 2763 2763 2764 2764 /*process units if requested: */ 2765 2765 if(process_units) maxvx=UnitConversion(maxvx,IuToExtEnum,VxEnum); … … 2769 2769 } 2770 2770 /*}}}*/ 2771 2771 /*FUNCTION Tria::MaxVy{{{*/ 2772 void Tria::MaxVy( double* pmaxvy, bool process_units){2772 void Tria::MaxVy(IssmDouble* pmaxvy, bool process_units){ 2773 2773 2774 2774 /*Get maximum:*/ 2775 double maxvy=this->inputs->Max(VyEnum);2775 IssmDouble maxvy=this->inputs->Max(VyEnum); 2776 2776 2777 2777 /*process units if requested: */ 2778 2778 if(process_units) maxvy=UnitConversion(maxvy,IuToExtEnum,VyEnum); … … 2783 2783 } 2784 2784 /*}}}*/ 2785 2785 /*FUNCTION Tria::MaxVz{{{*/ 2786 void Tria::MaxVz( double* pmaxvz, bool process_units){2786 void Tria::MaxVz(IssmDouble* pmaxvz, bool process_units){ 2787 2787 2788 2788 /*Get maximum:*/ 2789 double maxvz=this->inputs->Max(VzEnum);2789 IssmDouble maxvz=this->inputs->Max(VzEnum); 2790 2790 2791 2791 /*process units if requested: */ 2792 2792 if(process_units) maxvz=UnitConversion(maxvz,IuToExtEnum,VzEnum); … … 2796 2796 } 2797 2797 /*}}}*/ 2798 2798 /*FUNCTION Tria::MinVel{{{*/ 2799 void Tria::MinVel( double* pminvel, bool process_units){2799 void Tria::MinVel(IssmDouble* pminvel, bool process_units){ 2800 2800 2801 2801 /*Get minimum:*/ 2802 double minvel=this->inputs->Min(VelEnum);2802 IssmDouble minvel=this->inputs->Min(VelEnum); 2803 2803 2804 2804 /*process units if requested: */ 2805 2805 if(process_units) minvel=UnitConversion(minvel,IuToExtEnum,VelEnum); … … 2809 2809 } 2810 2810 /*}}}*/ 2811 2811 /*FUNCTION Tria::MinVx{{{*/ 2812 void Tria::MinVx( double* pminvx, bool process_units){2812 void Tria::MinVx(IssmDouble* pminvx, bool process_units){ 2813 2813 2814 2814 /*Get minimum:*/ 2815 double minvx=this->inputs->Min(VxEnum);2815 IssmDouble minvx=this->inputs->Min(VxEnum); 2816 2816 2817 2817 /*process units if requested: */ 2818 2818 if(process_units) minvx=UnitConversion(minvx,IuToExtEnum,VxEnum); … … 2822 2822 } 2823 2823 /*}}}*/ 2824 2824 /*FUNCTION Tria::MinVy{{{*/ 2825 void Tria::MinVy( double* pminvy, bool process_units){2825 void Tria::MinVy(IssmDouble* pminvy, bool process_units){ 2826 2826 2827 2827 /*Get minimum:*/ 2828 double minvy=this->inputs->Min(VyEnum);2828 IssmDouble minvy=this->inputs->Min(VyEnum); 2829 2829 2830 2830 /*process units if requested: */ 2831 2831 if(process_units) minvy=UnitConversion(minvy,IuToExtEnum,VyEnum); … … 2835 2835 } 2836 2836 /*}}}*/ 2837 2837 /*FUNCTION Tria::MinVz{{{*/ 2838 void Tria::MinVz( double* pminvz, bool process_units){2838 void Tria::MinVz(IssmDouble* pminvz, bool process_units){ 2839 2839 2840 2840 /*Get minimum:*/ 2841 double minvz=this->inputs->Min(VzEnum);2841 IssmDouble minvz=this->inputs->Min(VzEnum); 2842 2842 2843 2843 /*process units if requested: */ 2844 2844 if(process_units) minvz=UnitConversion(minvz,IuToExtEnum,VzEnum); … … 2848 2848 } 2849 2849 /*}}}*/ 2850 2850 /*FUNCTION Tria::ElementResponse{{{*/ 2851 void Tria::ElementResponse( double* presponse,int response_enum,bool process_units){2851 void Tria::ElementResponse(IssmDouble* presponse,int response_enum,bool process_units){ 2852 2852 2853 2853 switch(response_enum){ 2854 2854 case MaterialsRheologyBbarEnum: … … 2857 2857 case VelEnum: 2858 2858 2859 2859 /*Get input:*/ 2860 double vel;2860 IssmDouble vel; 2861 2861 Input* vel_input; 2862 2862 2863 2863 vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input); … … 2899 2899 2900 2900 /*Intermediaries*/ 2901 2901 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; 2910 2910 GaussTria *gauss = NULL; 2911 2911 2912 2912 /*Initialize Element matrix*/ … … 2964 2964 /*Intermediaries*/ 2965 2965 int i,j,ig; 2966 2966 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]; 2976 2976 Friction *friction = NULL; 2977 2977 GaussTria *gauss = NULL; 2978 2978 … … 3001 3001 //velocity should be = 0. To achieve this result, we set alpha2_list to a very high value: */ 3002 3002 surface_input->GetInputDerivativeValue(&slope[0],&xyz_list[0][0],gauss); 3003 3003 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); 3005 3005 else friction->GetAlpha2(&alpha2, gauss,VxEnum,VyEnum,VzEnum); 3006 3006 3007 3007 GetL(&L[0][0], &xyz_list[0][0], gauss,NDOF2); … … 3037 3037 /*Create Element matrix*/ 3038 3038 for(i=0;i<NUMVERTICES;i++){ 3039 3039 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; 3042 3042 } 3043 3043 3044 3044 /*Clean up and return*/ … … 3053 3053 3054 3054 /*Intermediaries */ 3055 3055 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]; 3062 3062 GaussTria* gauss=NULL; 3063 3063 3064 3064 /*Initialize Element vector*/ … … 3104 3104 3105 3105 /*Intermediaries */ 3106 3106 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]; 3111 3111 GaussTria* gauss=NULL; 3112 3112 3113 3113 /*Initialize Element vector*/ … … 3137 3137 3138 3138 constant_part=-2*pow(rho_ice*gravity,n)*pow(slope2,((n-1)/2)); 3139 3139 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]; 3142 3142 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; 3145 3145 } 3146 3146 3147 3147 /*Clean up and return*/ … … 3157 3157 3158 3158 /*Intermediaries */ 3159 3159 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]; 3169 3169 GaussTria *gauss=NULL; 3170 3170 3171 3171 /*Initialize Jacobian with regular MacAyeal (first part of the Gateau derivative)*/ … … 3222 3222 3223 3223 int i; 3224 3224 int* doflist=NULL; 3225 double vx,vy;3226 double values[numdof];3225 IssmDouble vx,vy; 3226 IssmDouble values[numdof]; 3227 3227 GaussTria* gauss=NULL; 3228 3228 3229 3229 /*Get dof list: */ … … 3260 3260 const int numdof=NDOF2*NUMVERTICES; 3261 3261 3262 3262 int i; 3263 double vx,vy;3264 double values[numdof];3263 IssmDouble vx,vy; 3264 IssmDouble values[numdof]; 3265 3265 int *doflist = NULL; 3266 3266 GaussTria *gauss = NULL; 3267 3267 … … 3294 3294 } 3295 3295 /*}}}*/ 3296 3296 /*FUNCTION Tria::InputUpdateFromSolutionDiagnosticHoriz {{{*/ 3297 void Tria::InputUpdateFromSolutionDiagnosticHoriz( double* solution){3297 void Tria::InputUpdateFromSolutionDiagnosticHoriz(IssmDouble* solution){ 3298 3298 3299 3299 const int numdof=NDOF2*NUMVERTICES; 3300 3300 3301 3301 int i; 3302 3302 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]; 3311 3311 3312 3312 /*Get dof list: */ 3313 3313 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); … … 3357 3357 } 3358 3358 /*}}}*/ 3359 3359 /*FUNCTION Tria::InputUpdateFromSolutionDiagnosticHutter {{{*/ 3360 void Tria::InputUpdateFromSolutionDiagnosticHutter( double* solution){3360 void Tria::InputUpdateFromSolutionDiagnosticHutter(IssmDouble* solution){ 3361 3361 3362 3362 const int numdof=NDOF2*NUMVERTICES; 3363 3363 3364 3364 int i; 3365 3365 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]; 3374 3374 3375 3375 /*Get dof list: */ 3376 3376 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); … … 3419 3419 3420 3420 #ifdef _HAVE_CONTROL_ 3421 3421 /*FUNCTION Tria::InputControlUpdate{{{*/ 3422 void Tria::InputControlUpdate( double scalar,bool save_parameter){3422 void Tria::InputControlUpdate(IssmDouble scalar,bool save_parameter){ 3423 3423 3424 3424 /*Intermediary*/ 3425 3425 int num_controls; … … 3473 3473 3474 3474 }/*}}}*/ 3475 3475 /*FUNCTION Tria::ControlInputScaleGradient{{{*/ 3476 void Tria::ControlInputScaleGradient(int enum_type, double scale){3476 void Tria::ControlInputScaleGradient(int enum_type,IssmDouble scale){ 3477 3477 3478 3478 Input* input=NULL; 3479 3479 … … 3489 3489 ((ControlInput*)input)->ScaleGradient(scale); 3490 3490 }/*}}}*/ 3491 3491 /*FUNCTION Tria::ControlInputSetGradient{{{*/ 3492 void Tria::ControlInputSetGradient( double* gradient,int enum_type,int control_index){3492 void Tria::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){ 3493 3493 3494 3494 int doflist1[NUMVERTICES]; 3495 double grad_list[NUMVERTICES];3495 IssmDouble grad_list[NUMVERTICES]; 3496 3496 Input* grad_input=NULL; 3497 3497 Input* input=NULL; 3498 3498 … … 3576 3576 3577 3577 int i,ig; 3578 3578 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}; 3584 3584 GaussTria *gauss=NULL; 3585 3585 3586 3586 /*Retrieve all inputs we will be needing: */ … … 3617 3617 /*Intermediaries*/ 3618 3618 int i,ig; 3619 3619 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}; 3626 3626 GaussTria *gauss = NULL; 3627 3627 3628 3628 /* Get node coordinates and dof list: */ … … 3675 3675 int analysis_type; 3676 3676 int doflist1[NUMVERTICES]; 3677 3677 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];*/ 3686 3686 Friction* friction=NULL; 3687 3687 GaussTria *gauss=NULL; 3688 3688 … … 3745 3745 // adjointy_input->GetInputValue(&mu, gauss); 3746 3746 // vx_input->GetInputValue(&vx,gauss); 3747 3747 // 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]); 3749 3749 //} 3750 3750 /*End Analytical gradient*/ 3751 3751 … … 3761 3761 3762 3762 int i,ig; 3763 3763 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}; 3769 3769 GaussTria *gauss=NULL; 3770 3770 3771 3771 /*Retrieve all inputs we will be needing: */ … … 3805 3805 3806 3806 /*Intermediaries*/ 3807 3807 int doflist1[NUMVERTICES]; 3808 double lambda[NUMVERTICES];3809 double gradient_g[NUMVERTICES];3808 IssmDouble lambda[NUMVERTICES]; 3809 IssmDouble gradient_g[NUMVERTICES]; 3810 3810 3811 3811 /*Compute Gradient*/ 3812 3812 GradientIndexing(&doflist1[0],control_index); … … 3822 3822 /*Intermediaries*/ 3823 3823 int i,ig; 3824 3824 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}; 3830 3830 GaussTria *gauss = NULL; 3831 3831 3832 3832 /* Get node coordinates and dof list: */ … … 3865 3865 /*Intermediaries*/ 3866 3866 int i,ig; 3867 3867 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}; 3873 3873 GaussTria *gauss = NULL; 3874 3874 3875 3875 /* Get node coordinates and dof list: */ … … 3916 3916 } 3917 3917 /*}}}*/ 3918 3918 /*FUNCTION Tria::RheologyBbarAbsGradient{{{*/ 3919 double Tria::RheologyBbarAbsGradient(bool process_units,int weight_index){3919 IssmDouble Tria::RheologyBbarAbsGradient(bool process_units,int weight_index){ 3920 3920 3921 3921 /* Intermediaries */ 3922 3922 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]; 3928 3928 GaussTria *gauss = NULL; 3929 3929 3930 3930 /*retrieve parameters and inputs*/ … … 3960 3960 } 3961 3961 /*}}}*/ 3962 3962 /*FUNCTION Tria::SurfaceAverageVelMisfit {{{*/ 3963 double Tria::SurfaceAverageVelMisfit(bool process_units,int weight_index){3963 IssmDouble Tria::SurfaceAverageVelMisfit(bool process_units,int weight_index){ 3964 3964 3965 3965 const int numdof=2*NUMVERTICES; 3966 3966 3967 3967 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]; 3972 3972 GaussTria *gauss=NULL; 3973 3973 3974 3974 /*If on water, return 0: */ … … 4021 4021 } 4022 4022 /*}}}*/ 4023 4023 /*FUNCTION Tria::SurfaceLogVelMisfit {{{*/ 4024 double Tria::SurfaceLogVelMisfit(bool process_units,int weight_index){4024 IssmDouble Tria::SurfaceLogVelMisfit(bool process_units,int weight_index){ 4025 4025 4026 4026 const int numdof=NDOF2*NUMVERTICES; 4027 4027 4028 4028 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; 4036 4036 GaussTria *gauss=NULL; 4037 4037 4038 4038 /*If on water, return 0: */ … … 4086 4086 } 4087 4087 /*}}}*/ 4088 4088 /*FUNCTION Tria::SurfaceLogVxVyMisfit {{{*/ 4089 double Tria::SurfaceLogVxVyMisfit(bool process_units,int weight_index){4089 IssmDouble Tria::SurfaceLogVxVyMisfit(bool process_units,int weight_index){ 4090 4090 4091 4091 const int numdof=NDOF2*NUMVERTICES; 4092 4092 4093 4093 int i,ig; 4094 4094 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]; 4101 4101 GaussTria *gauss=NULL; 4102 4102 4103 4103 /*If on water, return 0: */ … … 4152 4152 } 4153 4153 /*}}}*/ 4154 4154 /*FUNCTION Tria::SurfaceAbsVelMisfit {{{*/ 4155 double Tria::SurfaceAbsVelMisfit(bool process_units,int weight_index){4155 IssmDouble Tria::SurfaceAbsVelMisfit(bool process_units,int weight_index){ 4156 4156 4157 4157 const int numdof=NDOF2*NUMVERTICES; 4158 4158 4159 4159 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]; 4164 4164 GaussTria *gauss=NULL; 4165 4165 4166 4166 /*If on water, return 0: */ … … 4213 4213 } 4214 4214 /*}}}*/ 4215 4215 /*FUNCTION Tria::SurfaceRelVelMisfit {{{*/ 4216 double Tria::SurfaceRelVelMisfit(bool process_units,int weight_index){4216 IssmDouble Tria::SurfaceRelVelMisfit(bool process_units,int weight_index){ 4217 4217 const int numdof=2*NUMVERTICES; 4218 4218 4219 4219 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]; 4227 4227 GaussTria *gauss=NULL; 4228 4228 4229 4229 /*If on water, return 0: */ … … 4277 4277 } 4278 4278 /*}}}*/ 4279 4279 /*FUNCTION Tria::ThicknessAbsGradient{{{*/ 4280 double Tria::ThicknessAbsGradient(bool process_units,int weight_index){4280 IssmDouble Tria::ThicknessAbsGradient(bool process_units,int weight_index){ 4281 4281 4282 4282 /* Intermediaries */ 4283 4283 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]; 4289 4289 GaussTria *gauss = NULL; 4290 4290 4291 4291 /*retrieve parameters and inputs*/ … … 4321 4321 } 4322 4322 /*}}}*/ 4323 4323 /*FUNCTION Tria::ThicknessAbsMisfit {{{*/ 4324 double Tria::ThicknessAbsMisfit(bool process_units,int weight_index){4324 IssmDouble Tria::ThicknessAbsMisfit(bool process_units,int weight_index){ 4325 4325 4326 4326 /*Intermediaries*/ 4327 4327 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]; 4332 4332 GaussTria *gauss = NULL; 4333 double dH[2];4333 IssmDouble dH[2]; 4334 4334 4335 4335 /*If on water, return 0: */ 4336 4336 if(IsOnWater())return 0; … … 4373 4373 4374 4374 /*Intermediaries */ 4375 4375 int i,ig,resp; 4376 double Jdet;4377 double thickness,thicknessobs,weight;4376 IssmDouble Jdet; 4377 IssmDouble thickness,thicknessobs,weight; 4378 4378 int *responses = NULL; 4379 4379 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]; 4384 4384 GaussTria* gauss=NULL; 4385 4385 4386 4386 /*Initialize Element vector*/ … … 4441 4441 int i,resp,ig; 4442 4442 int *responses=NULL; 4443 4443 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]; 4453 4453 GaussTria* gauss=NULL; 4454 4454 4455 4455 /*Initialize Element vector*/ … … 4617 4617 int i,resp,ig; 4618 4618 int *responses=NULL; 4619 4619 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]; 4629 4629 GaussTria* gauss=NULL; 4630 4630 4631 4631 /*Initialize Element vector*/ … … 4788 4788 } 4789 4789 /*}}}*/ 4790 4790 /*FUNCTION Tria::DragCoefficientAbsGradient{{{*/ 4791 double Tria::DragCoefficientAbsGradient(bool process_units,int weight_index){4791 IssmDouble Tria::DragCoefficientAbsGradient(bool process_units,int weight_index){ 4792 4792 4793 4793 /* Intermediaries */ 4794 4794 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]; 4800 4800 GaussTria *gauss = NULL; 4801 4801 4802 4802 /*retrieve parameters and inputs*/ … … 4862 4862 /*Intermediaries */ 4863 4863 int i,j,ig; 4864 4864 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]; 4874 4874 GaussTria *gauss=NULL; 4875 4875 4876 4876 /*Initialize Jacobian with regular MacAyeal (first part of the Gateau derivative)*/ … … 4924 4924 } 4925 4925 /*}}}*/ 4926 4926 /*FUNCTION Tria::InputUpdateFromSolutionAdjointHoriz {{{*/ 4927 void Tria::InputUpdateFromSolutionAdjointHoriz( double* solution){4927 void Tria::InputUpdateFromSolutionAdjointHoriz(IssmDouble* solution){ 4928 4928 4929 4929 const int numdof=NDOF2*NUMVERTICES; 4930 4930 4931 4931 int i; 4932 4932 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]; 4936 4936 4937 4937 /*Get dof list: */ 4938 4938 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); … … 4959 4959 } 4960 4960 /*}}}*/ 4961 4961 /*FUNCTION Tria::InputUpdateFromSolutionAdjointBalancethickness {{{*/ 4962 void Tria::InputUpdateFromSolutionAdjointBalancethickness( double* solution){4962 void Tria::InputUpdateFromSolutionAdjointBalancethickness(IssmDouble* solution){ 4963 4963 4964 4964 const int numdof=NDOF1*NUMVERTICES; 4965 4965 4966 4966 int i; 4967 4967 int* doflist=NULL; 4968 double values[numdof];4969 double lambda[NUMVERTICES];4968 IssmDouble values[numdof]; 4969 IssmDouble lambda[NUMVERTICES]; 4970 4970 4971 4971 /*Get dof list: */ 4972 4972 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); … … 5016 5016 } 5017 5017 /*}}}*/ 5018 5018 /*FUNCTION Tria::SetControlInputsFromVector{{{*/ 5019 void Tria::SetControlInputsFromVector( double* vector,int control_enum,int control_index){5019 void Tria::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){ 5020 5020 5021 double values[NUMVERTICES];5021 IssmDouble values[NUMVERTICES]; 5022 5022 int doflist1[NUMVERTICES]; 5023 5023 Input *input = NULL; 5024 5024 Input *new_input = NULL; … … 5056 5056 void Tria::CreateHydrologyWaterVelocityInput(void){ 5057 5057 5058 5058 /*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.CR5061 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]; 5067 5067 GaussTria *gauss = NULL; 5068 5068 5069 5069 /*Retrieve all inputs and parameters*/ … … 5114 5114 const int numdof=NDOF1*NUMVERTICES; 5115 5115 5116 5116 /*Intermediaries */ 5117 double diffusivity;5117 IssmDouble diffusivity; 5118 5118 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}; 5131 5131 GaussTria *gauss=NULL; 5132 5132 5133 5133 /*Skip if water or ice shelf element*/ … … 5220 5220 5221 5221 /*Intermediaries */ 5222 5222 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]; 5228 5228 GaussTria* gauss=NULL; 5229 5229 5230 5230 /*Skip if water or ice shelf element*/ … … 5268 5268 5269 5269 int i; 5270 5270 int* doflist=NULL; 5271 double watercolumn;5272 double values[numdof];5271 IssmDouble watercolumn; 5272 IssmDouble values[numdof]; 5273 5273 GaussTria* gauss=NULL; 5274 5274 5275 5275 /*Get dof list: */ … … 5298 5298 } 5299 5299 /*}}}*/ 5300 5300 /*FUNCTION Tria::InputUpdateFromSolutionHydrology{{{*/ 5301 void Tria::InputUpdateFromSolutionHydrology( double* solution){5301 void Tria::InputUpdateFromSolutionHydrology(IssmDouble* solution){ 5302 5302 5303 5303 /*Intermediaries*/ 5304 5304 const int numdof = NDOF1*NUMVERTICES; 5305 5305 5306 5306 int i; 5307 5307 int* doflist=NULL; 5308 double values[numdof];5308 IssmDouble values[numdof]; 5309 5309 5310 5310 /*Get dof list: */ 5311 5311 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); … … 5314 5314 for(i=0;i<numdof;i++){ 5315 5315 values[i]=solution[doflist[i]]; 5316 5316 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 values5317 if (values[i]<pow((IssmDouble)10,(IssmDouble)-10))values[i]=pow((IssmDouble)10,(IssmDouble)-10); //correcting the water column to positive values 5318 5318 5319 5319 } 5320 5320 … … 5328 5328 #endif 5329 5329 5330 5330 #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);{{{*/ 5332 void Tria::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){ 5333 5333 5334 5334 int i,j; 5335 5335 … … 5341 5341 case VertexEnum: 5342 5342 5343 5343 /*New TriaP1Input*/ 5344 double values[3];5344 IssmDouble values[3]; 5345 5345 5346 5346 /*Get values on the 3 vertices*/ 5347 5347 for (i=0;i<3;i++){ … … 5352 5352 switch(name){ 5353 5353 case ThicknessEnum: 5354 5354 /*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]; 5360 5360 5361 5361 /*retrieve inputs: */ 5362 5362 GetInputListOnVertices(&thickness_init[0],ThicknessEnum); … … 5370 5370 /*build new bed and surface: */ 5371 5371 if (this->IsFloating()){ 5372 5372 /*hydrostatic equilibrium: */ 5373 double rho_ice,rho_water,di;5373 IssmDouble rho_ice,rho_water,di; 5374 5374 rho_ice=this->matpar->GetRhoIce(); 5375 5375 rho_water=this->matpar->GetRhoWater(); 5376 5376 … … 5440 5440 _error_(" not supported yet!"); 5441 5441 } 5442 5442 /*}}}*/ 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);{{{*/ 5444 void Tria::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){ 5445 5445 5446 5446 int i,j,t; 5447 5447 TransientInput* transientinput=NULL; 5448 double values[3];5449 double time;5448 IssmDouble values[3]; 5449 IssmDouble time; 5450 5450 int row; 5451 double yts;5451 IssmDouble yts; 5452 5452 5453 5453 /*Check that name is an element input*/ 5454 5454 if (!IsInput(name)) return; … … 5465 5465 /*create input values: */ 5466 5466 for(i=0;i<3;i++){ 5467 5467 row=this->nodes[i]->GetSidList(); 5468 values[i]=( double)matrix[ncols*row+t];5468 values[i]=(IssmDouble)matrix[ncols*row+t]; 5469 5469 } 5470 5470 5471 5471 /*time? :*/ 5472 time=( double)matrix[(nrows-1)*ncols+t]*yts;5472 time=(IssmDouble)matrix[(nrows-1)*ncols+t]*yts; 5473 5473 5474 5474 if(t==0) transientinput=new TransientInput(name); 5475 5475 transientinput->AddTimeInput(new TriaP1Input(name,values),time); … … 5510 5510 /*Intermediaries */ 5511 5511 int stabilization; 5512 5512 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; 5524 5524 GaussTria *gauss = NULL; 5525 5525 5526 5526 /*Initialize Element matrix*/ … … 5619 5619 5620 5620 /*Intermediaries*/ 5621 5621 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; 5628 5628 GaussTria *gauss=NULL; 5629 5629 5630 5630 /*Initialize Element matrix*/ … … 5687 5687 5688 5688 /*Intermediaries */ 5689 5689 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]; 5693 5693 GaussTria* gauss=NULL; 5694 5694 5695 5695 /*Initialize Element vector*/ … … 5730 5730 5731 5731 /*Intermediaries */ 5732 5732 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]; 5736 5736 GaussTria* gauss=NULL; 5737 5737 5738 5738 /*Initialize Element vector*/ -
u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/TriaRef.h
24 24 void SetElementType(int type,int type_counter); 25 25 26 26 /*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); 47 47 48 48 }; 49 49 #endif -
u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/PentaRef.cpp
57 57 58 58 /*Reference Element numerics*/ 59 59 /*FUNCTION PentaRef::GetBMacAyealPattyn {{{*/ 60 void PentaRef::GetBMacAyealPattyn( double* B, double* xyz_list, GaussPenta* gauss){60 void PentaRef::GetBMacAyealPattyn(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){ 61 61 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 62 62 * For node i, Bi can be expressed in the actual coordinate system 63 63 * by: … … 69 69 * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1) 70 70 */ 71 71 72 double dbasis[3][NUMNODESP1];72 IssmDouble dbasis[3][NUMNODESP1]; 73 73 74 74 /*Get dbasis in actual coordinate system: */ 75 75 GetNodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss); … … 88 88 } 89 89 /*}}}*/ 90 90 /*FUNCTION PentaRef::GetBMacAyealStokes{{{*/ 91 void PentaRef::GetBMacAyealStokes( double* B, double* xyz_list, GaussPenta* gauss){91 void PentaRef::GetBMacAyealStokes(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){ 92 92 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 93 93 * For node i, Bi can be expressed in the actual coordinate system 94 94 * by: … … 102 102 */ 103 103 104 104 int i; 105 double dh1dh7[3][NUMNODESMINI];106 double l1l6[NUMNODESP1];105 IssmDouble dh1dh7[3][NUMNODESMINI]; 106 IssmDouble l1l6[NUMNODESP1]; 107 107 108 108 /*Get dh1dh6 in actual coordinate system: */ 109 109 GetNodalFunctionsMINIDerivatives(&dh1dh7[0][0],xyz_list, gauss); … … 134 134 } 135 135 /*}}}*/ 136 136 /*FUNCTION PentaRef::GetBPattyn {{{*/ 137 void PentaRef::GetBPattyn( double* B, double* xyz_list, GaussPenta* gauss){137 void PentaRef::GetBPattyn(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){ 138 138 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 139 139 * For node i, Bi can be expressed in the actual coordinate system 140 140 * by: … … 148 148 * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1) 149 149 */ 150 150 151 double dbasis[3][NUMNODESP1];151 IssmDouble dbasis[3][NUMNODESP1]; 152 152 153 153 /*Get dbasis in actual coordinate system: */ 154 154 GetNodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss); … … 174 174 } 175 175 /*}}}*/ 176 176 /*FUNCTION PentaRef::GetBprimePattyn {{{*/ 177 void PentaRef::GetBprimePattyn( double* B, double* xyz_list, GaussPenta* gauss_coord){177 void PentaRef::GetBprimePattyn(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss_coord){ 178 178 /*Compute B prime matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 179 179 * For node i, Bi can be expressed in the actual coordinate system 180 180 * by: … … 187 187 * 188 188 * We assume B has been allocated already, of size: 5x(NDOF2*NUMNODESP1) 189 189 */ 190 double dbasis[3][NUMNODESP1];190 IssmDouble dbasis[3][NUMNODESP1]; 191 191 192 192 /*Get dbasis in actual coordinate system: */ 193 193 GetNodalFunctionsP1Derivatives(&dbasis[0][0],xyz_list, gauss_coord); … … 212 212 } 213 213 /*}}}*/ 214 214 /*FUNCTION PentaRef::GetBprimeMacAyealStokes{{{*/ 215 void PentaRef::GetBprimeMacAyealStokes( double* Bprime, double* xyz_list, GaussPenta* gauss){215 void PentaRef::GetBprimeMacAyealStokes(IssmDouble* Bprime, IssmDouble* xyz_list, GaussPenta* gauss){ 216 216 /*Compute Bprime matrix. Bprime=[Bprime1 Bprime2 Bprime3 Bprime4 Bprime5 Bprime6] where Bprimei is of size 5*NDOF2. 217 217 * For node i, Bprimei can be expressed in the actual coordinate system 218 218 * by: … … 225 225 */ 226 226 227 227 int i; 228 double dh1dh7[3][NUMNODESMINI];228 IssmDouble dh1dh7[3][NUMNODESMINI]; 229 229 230 230 /*Get dh1dh6 in actual coordinate system: */ 231 231 GetNodalFunctionsMINIDerivatives(&dh1dh7[0][0],xyz_list, gauss); … … 252 252 } 253 253 /*}}}*/ 254 254 /*FUNCTION PentaRef::GetBStokes {{{*/ 255 void PentaRef::GetBStokes( double* B, double* xyz_list, GaussPenta* gauss){255 void PentaRef::GetBStokes(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){ 256 256 257 257 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 3*NDOF4. 258 258 * For node i, Bi can be expressed in the actual coordinate system … … 270 270 271 271 int i; 272 272 273 double dh1dh7[3][NUMNODESMINI];274 double l1l6[NUMNODESP1];273 IssmDouble dh1dh7[3][NUMNODESMINI]; 274 IssmDouble l1l6[NUMNODESP1]; 275 275 276 276 /*Get dh1dh7 in actual coordinate system: */ 277 277 GetNodalFunctionsMINIDerivatives(&dh1dh7[0][0],xyz_list, gauss); … … 319 319 } 320 320 /*}}}*/ 321 321 /*FUNCTION PentaRef::GetBprimeStokes {{{*/ 322 void PentaRef::GetBprimeStokes( double* B_prime, double* xyz_list, GaussPenta* gauss){322 void PentaRef::GetBprimeStokes(IssmDouble* B_prime, IssmDouble* xyz_list, GaussPenta* gauss){ 323 323 /* Compute B' matrix. B'=[B1' B2' B3' B4' B5' B6' Bb'] where Bi' is of size 3*NDOF2. 324 324 * For node i, Bi' can be expressed in the actual coordinate system 325 325 * by: … … 337 337 */ 338 338 339 339 int i; 340 double dh1dh7[3][NUMNODESMINI];341 double l1l6[NUMNODESP1];340 IssmDouble dh1dh7[3][NUMNODESMINI]; 341 IssmDouble l1l6[NUMNODESP1]; 342 342 343 343 /*Get dh1dh7 in actual coordinate system: */ 344 344 GetNodalFunctionsMINIDerivatives(&dh1dh7[0][0],xyz_list, gauss); … … 386 386 } 387 387 /*}}}*/ 388 388 /*FUNCTION PentaRef::GetBAdvec{{{*/ 389 void PentaRef::GetBAdvec( double* B_advec, double* xyz_list, GaussPenta* gauss){389 void PentaRef::GetBAdvec(IssmDouble* B_advec, IssmDouble* xyz_list, GaussPenta* gauss){ 390 390 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 391 391 * For node i, Bi' can be expressed in the actual coordinate system 392 392 * by: … … 399 399 */ 400 400 401 401 /*Same thing in the actual coordinate system: */ 402 double l1l6[6];402 IssmDouble l1l6[6]; 403 403 404 404 /*Get dh1dh2dh3 in actual coordinates system : */ 405 405 GetNodalFunctionsP1(l1l6, gauss); … … 413 413 } 414 414 /*}}}*/ 415 415 /*FUNCTION PentaRef::GetBConduct{{{*/ 416 void PentaRef::GetBConduct( double* B_conduct, double* xyz_list, GaussPenta* gauss){416 void PentaRef::GetBConduct(IssmDouble* B_conduct, IssmDouble* xyz_list, GaussPenta* gauss){ 417 417 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 418 418 * For node i, Bi' can be expressed in the actual coordinate system 419 419 * by: … … 426 426 */ 427 427 428 428 /*Same thing in the actual coordinate system: */ 429 double dh1dh6[3][NUMNODESP1];429 IssmDouble dh1dh6[3][NUMNODESP1]; 430 430 431 431 /*Get dh1dh2dh3 in actual coordinates system : */ 432 432 GetNodalFunctionsP1Derivatives(&dh1dh6[0][0],xyz_list,gauss); … … 440 440 } 441 441 /*}}}*/ 442 442 /*FUNCTION PentaRef::GetBVert{{{*/ 443 void PentaRef::GetBVert( double* B, double* xyz_list, GaussPenta* gauss){443 void PentaRef::GetBVert(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){ 444 444 /* Compute B matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz]; 445 445 where hi is the interpolation function for node i.*/ 446 446 447 447 int i; 448 double dh1dh6[3][NUMNODESP1];448 IssmDouble dh1dh6[3][NUMNODESP1]; 449 449 450 450 /*Get dh1dh6 in actual coordinate system: */ 451 451 GetNodalFunctionsP1Derivatives(&dh1dh6[0][0],xyz_list, gauss); … … 458 458 } 459 459 /*}}}*/ 460 460 /*FUNCTION PentaRef::GetBprimeAdvec{{{*/ 461 void PentaRef::GetBprimeAdvec( double* Bprime_advec, double* xyz_list, GaussPenta* gauss){461 void PentaRef::GetBprimeAdvec(IssmDouble* Bprime_advec, IssmDouble* xyz_list, GaussPenta* gauss){ 462 462 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF1. 463 463 * For node i, Bi' can be expressed in the actual coordinate system 464 464 * by: … … 471 471 */ 472 472 473 473 /*Same thing in the actual coordinate system: */ 474 double dh1dh6[3][NUMNODESP1];474 IssmDouble dh1dh6[3][NUMNODESP1]; 475 475 476 476 /*Get dh1dh2dh3 in actual coordinates system : */ 477 477 GetNodalFunctionsP1Derivatives(&dh1dh6[0][0],xyz_list,gauss); … … 485 485 } 486 486 /*}}}*/ 487 487 /*FUNCTION PentaRef::GetBprimeVert{{{*/ 488 void PentaRef::GetBprimeVert( double* B, double* xyz_list, GaussPenta* gauss){488 void PentaRef::GetBprimeVert(IssmDouble* B, IssmDouble* xyz_list, GaussPenta* gauss){ 489 489 /* Compute Bprime matrix. Bprime=[L1 L2 L3 L4 L5 L6] where Li is the nodal function for node i*/ 490 490 491 491 GetNodalFunctionsP1(B, gauss); … … 493 493 } 494 494 /*}}}*/ 495 495 /*FUNCTION PentaRef::GetL{{{*/ 496 void PentaRef::GetL( double* L, GaussPenta* gauss, int numdof){496 void PentaRef::GetL(IssmDouble* L, GaussPenta* gauss, int numdof){ 497 497 /*Compute L matrix. L=[L1 L2 L3] where Li is square and of size numdof. 498 498 ** For node i, Li can be expressed in the actual coordinate system 499 499 ** by: … … 508 508 **/ 509 509 510 510 int i; 511 double l1l6[6];511 IssmDouble l1l6[6]; 512 512 513 513 /*Get l1l6 in actual coordinate system: */ 514 514 GetNodalFunctionsP1(l1l6,gauss); … … 530 530 } 531 531 /*}}}*/ 532 532 /*FUNCTION PentaRef::GetLStokes{{{*/ 533 void PentaRef::GetLStokes( double* LStokes, GaussPenta* gauss){533 void PentaRef::GetLStokes(IssmDouble* LStokes, GaussPenta* gauss){ 534 534 /* 535 535 * Compute L matrix. L=[L1 L2 L3] where Li is square and of size numdof. 536 536 * For node i, Li can be expressed in the actual coordinate system … … 543 543 */ 544 544 545 545 const int num_dof=4; 546 double l1l2l3[NUMNODESP1_2d];546 IssmDouble l1l2l3[NUMNODESP1_2d]; 547 547 548 548 /*Get l1l2l3 in actual coordinate system: */ 549 549 l1l2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0; … … 565 565 } 566 566 /*}}}*/ 567 567 /*FUNCTION PentaRef::GetLprimeStokes {{{*/ 568 void PentaRef::GetLprimeStokes( double* LprimeStokes, double* xyz_list, GaussPenta* gauss){568 void PentaRef::GetLprimeStokes(IssmDouble* LprimeStokes, IssmDouble* xyz_list, GaussPenta* gauss){ 569 569 570 570 /* 571 571 * Compute Lprime matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. … … 605 605 int i; 606 606 int num_dof=4; 607 607 608 double l1l2l3[NUMNODESP1_2d];609 double dh1dh6[3][NUMNODESP1];608 IssmDouble l1l2l3[NUMNODESP1_2d]; 609 IssmDouble dh1dh6[3][NUMNODESP1]; 610 610 611 611 /*Get l1l2l3 in actual coordinate system: */ 612 612 l1l2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0; … … 677 677 } 678 678 /*}}}*/ 679 679 /*FUNCTION PentaRef::GetLMacAyealStokes {{{*/ 680 void PentaRef::GetLMacAyealStokes( double* LStokes, GaussPenta* gauss){680 void PentaRef::GetLMacAyealStokes(IssmDouble* LStokes, GaussPenta* gauss){ 681 681 /* 682 682 * Compute L matrix. L=[L1 L2 L3] where Li is square and of size numdof. 683 683 * For node i, Li can be expressed in the actual coordinate system … … 696 696 int i; 697 697 int num_dof=2; 698 698 699 double l1l2l3[NUMNODESP1_2d];699 IssmDouble l1l2l3[NUMNODESP1_2d]; 700 700 701 701 702 702 /*Get l1l2l3 in actual coordinate system: */ … … 727 727 } 728 728 /*}}}*/ 729 729 /*FUNCTION PentaRef::GetLprimeMacAyealStokes {{{*/ 730 void PentaRef::GetLprimeMacAyealStokes( double* LprimeStokes, double* xyz_list, GaussPenta* gauss){730 void PentaRef::GetLprimeMacAyealStokes(IssmDouble* LprimeStokes, IssmDouble* xyz_list, GaussPenta* gauss){ 731 731 732 732 /* 733 733 * Compute Lprime matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. … … 746 746 int i; 747 747 int num_dof=4; 748 748 749 double l1l2l3[NUMNODESP1_2d];750 double dh1dh6[3][NUMNODESP1];749 IssmDouble l1l2l3[NUMNODESP1_2d]; 750 IssmDouble dh1dh6[3][NUMNODESP1]; 751 751 752 752 /*Get l1l2l3 in actual coordinate system: */ 753 753 l1l2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0; … … 794 794 } 795 795 /*}}}*/ 796 796 /*FUNCTION PentaRef::GetLStokesMacAyeal {{{*/ 797 void PentaRef::GetLStokesMacAyeal( double* LStokes, GaussPenta* gauss){797 void PentaRef::GetLStokesMacAyeal(IssmDouble* LStokes, GaussPenta* gauss){ 798 798 /* 799 799 * Compute L matrix. L=[L1 L2 L3] where Li is square and of size numdof. 800 800 * For node i, Li can be expressed in the actual coordinate system … … 809 809 int i; 810 810 int num_dof=4; 811 811 812 double l1l2l3[NUMNODESP1_2d];812 IssmDouble l1l2l3[NUMNODESP1_2d]; 813 813 814 814 815 815 /*Get l1l2l3 in actual coordinate system: */ … … 840 840 } 841 841 /*}}}*/ 842 842 /*FUNCTION PentaRef::GetLprimeStokesMacAyeal {{{*/ 843 void PentaRef::GetLprimeStokesMacAyeal( double* LprimeStokes, double* xyz_list, GaussPenta* gauss){843 void PentaRef::GetLprimeStokesMacAyeal(IssmDouble* LprimeStokes, IssmDouble* xyz_list, GaussPenta* gauss){ 844 844 845 845 /* 846 846 * Compute Lprime matrix. Lprime=[Lp1 Lp2 Lp3] where Lpi is square and of size numdof. … … 855 855 int i; 856 856 int num_dof=2; 857 857 858 double l1l2l3[NUMNODESP1_2d];859 double dh1dh6[3][NUMNODESP1];858 IssmDouble l1l2l3[NUMNODESP1_2d]; 859 IssmDouble dh1dh6[3][NUMNODESP1]; 860 860 861 861 /*Get l1l2l3 in actual coordinate system: */ 862 862 l1l2l3[0]=gauss->coord1*(1-gauss->coord4)/2.0; … … 879 879 } 880 880 /*}}}*/ 881 881 /*FUNCTION PentaRef::GetJacobian {{{*/ 882 void PentaRef::GetJacobian( double* J, double* xyz_list,GaussPenta* gauss){882 void PentaRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussPenta* gauss){ 883 883 884 884 int i,j; 885 885 886 886 /*The Jacobian is constant over the element, discard the gaussian points. 887 887 * J is assumed to have been allocated of size NDOF2xNDOF2.*/ 888 888 889 double A1,A2,A3; //area coordinates890 double xi,eta,zi; //parametric coordinates889 IssmDouble A1,A2,A3; //area coordinates 890 IssmDouble xi,eta,zi; //parametric coordinates 891 891 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; 895 895 896 896 /*Figure out xi,eta and zi (parametric coordinates), for this gaussian point: */ 897 897 A1=gauss->coord1; … … 938 938 } 939 939 /*}}}*/ 940 940 /*FUNCTION PentaRef::GetJacobianDeterminant {{{*/ 941 void PentaRef::GetJacobianDeterminant( double* Jdet, double* xyz_list,GaussPenta* gauss){941 void PentaRef::GetJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,GaussPenta* gauss){ 942 942 /*On a penta, Jacobian varies according to coordinates. We need to get the Jacobian, and take 943 943 * the determinant of it: */ 944 double J[3][3];944 IssmDouble J[3][3]; 945 945 946 946 /*Get Jacobian*/ 947 947 GetJacobian(&J[0][0],xyz_list,gauss); … … 953 953 } 954 954 /*}}}*/ 955 955 /*FUNCTION PentaRef::GetTriaJacobianDeterminant{{{*/ 956 void PentaRef::GetTriaJacobianDeterminant( double* Jdet, double* xyz_list,GaussPenta* gauss){956 void PentaRef::GetTriaJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,GaussPenta* gauss){ 957 957 /*The Jacobian determinant is constant over the element, discard the gaussian points. 958 958 * J is assumed to have been allocated of size NDOF2xNDOF2.*/ 959 959 960 double x1,x2,x3,y1,y2,y3,z1,z2,z3;960 IssmDouble x1,x2,x3,y1,y2,y3,z1,z2,z3; 961 961 962 962 x1=*(xyz_list+3*0+0); 963 963 y1=*(xyz_list+3*0+1); … … 975 975 } 976 976 /*}}}*/ 977 977 /*FUNCTION PentaRef::GetSegmentJacobianDeterminant{{{*/ 978 void PentaRef::GetSegmentJacobianDeterminant( double* Jdet, double* xyz_list,GaussPenta* gauss){978 void PentaRef::GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,GaussPenta* gauss){ 979 979 /*The Jacobian determinant is constant over the element, discard the gaussian points. 980 980 * J is assumed to have been allocated of size NDOF2xNDOF2.*/ 981 981 982 double x1,x2,y1,y2,z1,z2;982 IssmDouble x1,x2,y1,y2,z1,z2; 983 983 984 984 x1=*(xyz_list+3*0+0); 985 985 y1=*(xyz_list+3*0+1); … … 994 994 } 995 995 /*}}}*/ 996 996 /*FUNCTION PentaRef::GetJacobianInvert {{{*/ 997 void PentaRef::GetJacobianInvert( double* Jinv, double* xyz_list,GaussPenta* gauss){997 void PentaRef::GetJacobianInvert(IssmDouble* Jinv, IssmDouble* xyz_list,GaussPenta* gauss){ 998 998 999 999 /*Jacobian*/ 1000 double J[3][3];1000 IssmDouble J[3][3]; 1001 1001 1002 1002 /*Call Jacobian routine to get the jacobian:*/ 1003 1003 GetJacobian(&J[0][0], xyz_list, gauss); … … 1007 1007 } 1008 1008 /*}}}*/ 1009 1009 /*FUNCTION PentaRef::GetNodalFunctionsMINI{{{*/ 1010 void PentaRef::GetNodalFunctionsMINI( double* l1l7, GaussPenta* gauss){1010 void PentaRef::GetNodalFunctionsMINI(IssmDouble* l1l7, GaussPenta* gauss){ 1011 1011 /*This routine returns the values of the nodal functions at the gaussian point.*/ 1012 1012 1013 1013 l1l7[0]=gauss->coord1*(1.0-gauss->coord4)/2.0; … … 1021 1021 } 1022 1022 /*}}}*/ 1023 1023 /*FUNCTION PentaRef::GetNodalFunctionsMINIDerivatives{{{*/ 1024 void PentaRef::GetNodalFunctionsMINIDerivatives( double* dh1dh7,double* xyz_list, GaussPenta* gauss){1024 void PentaRef::GetNodalFunctionsMINIDerivatives(IssmDouble* dh1dh7,IssmDouble* xyz_list, GaussPenta* gauss){ 1025 1025 1026 1026 /*This routine returns the values of the nodal functions derivatives (with respect to the 1027 1027 * actual coordinate system): */ 1028 1028 1029 1029 int i; 1030 double dh1dh7_ref[3][NUMNODESMINI];1031 double Jinv[3][3];1030 IssmDouble dh1dh7_ref[3][NUMNODESMINI]; 1031 IssmDouble Jinv[3][3]; 1032 1032 1033 1033 /*Get derivative values with respect to parametric coordinate system: */ 1034 1034 GetNodalFunctionsMINIDerivativesReference(&dh1dh7_ref[0][0], gauss); … … 1052 1052 } 1053 1053 /*}}}*/ 1054 1054 /*FUNCTION PentaRef::GetNodalFunctionsMINIDerivativesReference{{{*/ 1055 void PentaRef::GetNodalFunctionsMINIDerivativesReference( double* dl1dl7,GaussPenta* gauss){1055 void PentaRef::GetNodalFunctionsMINIDerivativesReference(IssmDouble* dl1dl7,GaussPenta* gauss){ 1056 1056 1057 1057 /*This routine returns the values of the nodal functions derivatives (with respect to the 1058 1058 * 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; 1062 1062 1063 1063 /*First nodal function: */ 1064 1064 *(dl1dl7+NUMNODESMINI*0+0)=-0.5*(1.0-zeta)/2.0; … … 1098 1098 } 1099 1099 /*}}}*/ 1100 1100 /*FUNCTION PentaRef::GetNodalFunctionsP1 {{{*/ 1101 void PentaRef::GetNodalFunctionsP1( double* l1l6, GaussPenta* gauss){1101 void PentaRef::GetNodalFunctionsP1(IssmDouble* l1l6, GaussPenta* gauss){ 1102 1102 /*This routine returns the values of the nodal functions at the gaussian point.*/ 1103 1103 1104 1104 l1l6[0]=gauss->coord1*(1-gauss->coord4)/2.0; … … 1111 1111 } 1112 1112 /*}}}*/ 1113 1113 /*FUNCTION PentaRef::GetNodalFunctionsP1Derivatives {{{*/ 1114 void PentaRef::GetNodalFunctionsP1Derivatives( double* dh1dh6,double* xyz_list, GaussPenta* gauss){1114 void PentaRef::GetNodalFunctionsP1Derivatives(IssmDouble* dh1dh6,IssmDouble* xyz_list, GaussPenta* gauss){ 1115 1115 1116 1116 /*This routine returns the values of the nodal functions derivatives (with respect to the 1117 1117 * 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]; 1120 1120 1121 1121 /*Get derivative values with respect to parametric coordinate system: */ 1122 1122 GetNodalFunctionsP1DerivativesReference(&dh1dh6_ref[0][0], gauss); … … 1140 1140 } 1141 1141 /*}}}*/ 1142 1142 /*FUNCTION PentaRef::GetNodalFunctionsP1DerivativesReference {{{*/ 1143 void PentaRef::GetNodalFunctionsP1DerivativesReference( double* dl1dl6,GaussPenta* gauss){1143 void PentaRef::GetNodalFunctionsP1DerivativesReference(IssmDouble* dl1dl6,GaussPenta* gauss){ 1144 1144 1145 1145 /*This routine returns the values of the nodal functions derivatives (with respect to the 1146 1146 * natural coordinate system) at the gaussian point. Those values vary along xi,eta,z */ 1147 1147 1148 double A1,A2,A3,z;1148 IssmDouble A1,A2,A3,z; 1149 1149 1150 1150 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); 1151 1151 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); … … 1184 1184 } 1185 1185 /*}}}*/ 1186 1186 /*FUNCTION PentaRef::GetQuadNodalFunctions {{{*/ 1187 void PentaRef::GetQuadNodalFunctions( double* l1l4,GaussPenta* gauss,int index1,int index2,int index3,int index4){1187 void PentaRef::GetQuadNodalFunctions(IssmDouble* l1l4,GaussPenta* gauss,int index1,int index2,int index3,int index4){ 1188 1188 /*This routine returns the values of the nodal functions at the gaussian point.*/ 1189 1189 1190 double BasisFunctions[6];1190 IssmDouble BasisFunctions[6]; 1191 1191 1192 1192 GetNodalFunctionsP1(&BasisFunctions[0],gauss); 1193 1193 … … 1204 1204 } 1205 1205 /*}}}*/ 1206 1206 /*FUNCTION PentaRef::GetQuadJacobianDeterminant{{{*/ 1207 void PentaRef::GetQuadJacobianDeterminant( double* Jdet,double xyz_list[4][3],GaussPenta* gauss){1207 void PentaRef::GetQuadJacobianDeterminant(IssmDouble* Jdet,IssmDouble xyz_list[4][3],GaussPenta* gauss){ 1208 1208 /*This routine returns the values of the nodal functions at the gaussian point.*/ 1209 1209 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; 1211 1211 1212 1212 x1=xyz_list[0][0]; 1213 1213 y1=xyz_list[0][1]; … … 1230 1230 } 1231 1231 /*}}}*/ 1232 1232 /*FUNCTION PentaRef::GetInputValue{{{*/ 1233 void PentaRef::GetInputValue( double* pvalue,double* plist,GaussPenta* gauss){1233 void PentaRef::GetInputValue(IssmDouble* pvalue,IssmDouble* plist,GaussPenta* gauss){ 1234 1234 /*P1 interpolation on Gauss point*/ 1235 1235 1236 1236 /*intermediary*/ 1237 double l1l6[6];1237 IssmDouble l1l6[6]; 1238 1238 1239 1239 /*nodal functions: */ 1240 1240 GetNodalFunctionsP1(&l1l6[0],gauss); … … 1245 1245 } 1246 1246 /*}}}*/ 1247 1247 /*FUNCTION PentaRef::GetInputDerivativeValue{{{*/ 1248 void PentaRef::GetInputDerivativeValue( double* p, double* plist,double* xyz_list, GaussPenta* gauss){1248 void PentaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussPenta* gauss){ 1249 1249 /*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: 1250 1250 * 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; 1251 1251 * 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; … … 1253 1253 * 1254 1254 * p is a vector of size 3x1 already allocated. 1255 1255 */ 1256 double dh1dh6[3][NUMNODESP1];1256 IssmDouble dh1dh6[3][NUMNODESP1]; 1257 1257 1258 1258 /*Get nodal funnctions derivatives in actual coordinate system: */ 1259 1259 GetNodalFunctionsP1Derivatives(&dh1dh6[0][0],xyz_list, gauss); -
u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/Tria.h
54 54 Object* copy(); 55 55 /*}}}*/ 56 56 /*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); 59 59 void InputUpdateFromVector(int* vector, int name, int type); 60 60 void InputUpdateFromVector(bool* vector, int name, int type); 61 61 #ifdef _HAVE_DAKOTA_ 62 void InputUpdateFromVectorDakota( double* vector, int name, int type);62 void InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type); 63 63 void InputUpdateFromVectorDakota(int* vector, int name, int type); 64 64 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); 66 66 #endif 67 void InputUpdateFromConstant( double constant, int name);67 void InputUpdateFromConstant(IssmDouble constant, int name); 68 68 void InputUpdateFromConstant(int constant, int name); 69 69 void InputUpdateFromConstant(bool constant, int name); 70 70 void InputUpdateFromIoModel(int index, IoModel* iomodel); 71 71 /*}}}*/ 72 72 /*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); 74 74 void ComputeBasalStress(Vector* sigma_b); 75 75 void ComputeStrainRate(Vector* eps); 76 76 void ComputeStressTensor(); … … 84 84 bool IsOnBed(); 85 85 bool IsFloating(); 86 86 bool IsNodeOnShelf(); 87 bool IsNodeOnShelfFromFlags( double* flags);87 bool IsNodeOnShelfFromFlags(IssmDouble* flags); 88 88 bool IsOnWater(); 89 89 void GetSolutionFromInputs(Vector* solution); 90 90 void GetVectorFromInputs(Vector* vector, int name_enum); 91 91 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); 96 96 void InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum=MeshElementsEnum); 97 97 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); 100 100 void DeleteResults(void); 101 101 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); 104 104 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); 108 108 void PatchFill(int* pcount, Patch* patch); 109 109 void PatchSize(int* pnumrows, int* pnumvertices,int* pnumnodes); 110 110 void ProcessResultsUnits(void); 111 111 void ResetCoordinateSystem(void){_error_("not implemented yet");}; 112 double SurfaceArea(void);112 IssmDouble SurfaceArea(void); 113 113 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(); 116 116 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); 118 118 119 119 #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); 134 134 #endif 135 135 136 136 137 137 #ifdef _HAVE_CONTROL_ 138 double DragCoefficientAbsGradient(bool process_units,int weight_index);138 IssmDouble DragCoefficientAbsGradient(bool process_units,int weight_index); 139 139 void GradientIndexing(int* indexing,int control_index); 140 140 void Gradj(Vector* gradient,int control_type,int control_index); 141 141 void GradjBGradient(Vector* gradient,int weight_index,int control_index); … … 147 147 void GradjVxBalancedthickness(Vector* gradient,int control_index); 148 148 void GradjVyBalancedthickness(Vector* gradient,int control_index); 149 149 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); 151 151 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); 163 163 #endif 164 164 165 165 /*}}}*/ … … 179 179 ElementVector* CreatePVectorPrognostic_CG(void); 180 180 ElementVector* CreatePVectorPrognostic_DG(void); 181 181 ElementVector* CreatePVectorSlope(void); 182 double GetArea(void);182 IssmDouble GetArea(void); 183 183 int GetElementType(void); 184 184 void GetDofList(int** pdoflist,int approximation_enum,int setenum); 185 185 void GetDofList1(int* doflist); 186 186 void GetSidList(int* sidlist); 187 187 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 REMOVED191 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); 195 195 bool IsInput(int name); 196 196 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]); 198 198 199 199 #ifdef _HAVE_DIAGNOSTIC_ 200 200 ElementMatrix* CreateKMatrixDiagnosticMacAyeal(void); … … 206 206 ElementMatrix* CreateJacobianDiagnosticMacayeal(void); 207 207 void GetSolutionFromInputsDiagnosticHoriz(Vector* solution); 208 208 void GetSolutionFromInputsDiagnosticHutter(Vector* solution); 209 void InputUpdateFromSolutionDiagnosticHoriz( double* solution);210 void InputUpdateFromSolutionDiagnosticHutter( double* solution);209 void InputUpdateFromSolutionDiagnosticHoriz( IssmDouble* solution); 210 void InputUpdateFromSolutionDiagnosticHutter( IssmDouble* solution); 211 211 #endif 212 212 213 213 #ifdef _HAVE_CONTROL_ … … 216 216 ElementVector* CreatePVectorAdjointHoriz(void); 217 217 ElementVector* CreatePVectorAdjointStokes(void); 218 218 ElementVector* CreatePVectorAdjointBalancethickness(void); 219 void InputUpdateFromSolutionAdjointBalancethickness( double* solution);220 void InputUpdateFromSolutionAdjointHoriz( double* solution);219 void InputUpdateFromSolutionAdjointBalancethickness( IssmDouble* solution); 220 void InputUpdateFromSolutionAdjointHoriz( IssmDouble* solution); 221 221 #endif 222 222 223 223 #ifdef _HAVE_HYDROLOGY_ … … 225 225 ElementVector* CreatePVectorHydrology(void); 226 226 void CreateHydrologyWaterVelocityInput(void); 227 227 void GetSolutionFromInputsHydrology(Vector* solution); 228 void InputUpdateFromSolutionHydrology( double* solution);228 void InputUpdateFromSolutionHydrology(IssmDouble* solution); 229 229 #endif 230 230 #ifdef _HAVE_BALANCED_ 231 231 #endif -
u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/Penta.cpp
144 144 145 145 /*Other*/ 146 146 /*FUNCTION Penta::AverageOntoPartition {{{*/ 147 void Penta::AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas, double* vertex_response,double* qmu_part){147 void Penta::AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part){ 148 148 _error_("Not supported yet!"); 149 149 } 150 150 /*}}}*/ 151 151 /*FUNCTION Penta::BedNormal {{{*/ 152 void Penta::BedNormal( double* bed_normal, double xyz_list[3][3]){152 void Penta::BedNormal(IssmDouble* bed_normal, IssmDouble xyz_list[3][3]){ 153 153 154 154 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; 158 158 159 159 for (i=0;i<3;i++){ 160 160 v13[i]=xyz_list[0][i]-xyz_list[2][i]; … … 180 180 181 181 /*Intermediaries */ 182 182 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; 185 185 Friction* friction=NULL; 186 186 GaussPenta* gauss=NULL; 187 187 … … 232 232 int dofp[1]={3}; 233 233 int analysis_type,approximation; 234 234 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; 247 247 GaussPenta* gauss; 248 248 249 249 /*retrive parameters: */ … … 325 325 void Penta::ComputeStressTensor(){ 326 326 327 327 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]; 337 337 GaussPenta* gauss=NULL; 338 338 339 339 /* Get node coordinates and dof list: */ … … 763 763 } 764 764 /*}}}*/ 765 765 /*FUNCTION Penta::GetElementSizes{{{*/ 766 void Penta::GetElementSizes( double* hx,double* hy,double* hz){766 void Penta::GetElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){ 767 767 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; 771 771 772 772 /*Get xyz list: */ 773 773 GetVerticesCoordinates(&xyz_list[0][0],nodes,NUMVERTICES); … … 819 819 820 820 } 821 821 /*}}}*/ 822 /*FUNCTION Penta::GetInputListOnVertices( double* pvalue,int enumtype) {{{*/823 void Penta::GetInputListOnVertices( double* pvalue,int enumtype){822 /*FUNCTION Penta::GetInputListOnVertices(IssmDouble* pvalue,int enumtype) {{{*/ 823 void Penta::GetInputListOnVertices(IssmDouble* pvalue,int enumtype){ 824 824 825 825 /*Intermediaries*/ 826 double value[NUMVERTICES];826 IssmDouble value[NUMVERTICES]; 827 827 GaussPenta *gauss = NULL; 828 828 829 829 /*Recover input*/ … … 844 844 delete gauss; 845 845 } 846 846 /*}}}*/ 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) {{{*/ 848 void Penta::GetInputListOnVertices(IssmDouble* pvalue,int enumtype,IssmDouble defaultvalue){ 849 849 850 850 /*Intermediaries*/ 851 double value[NUMVERTICES];851 IssmDouble value[NUMVERTICES]; 852 852 GaussPenta *gauss = NULL; 853 853 854 854 /*Recover input*/ … … 873 873 delete gauss; 874 874 } 875 875 /*}}}*/ 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) {{{*/ 877 void Penta::GetInputValue(IssmDouble* pvalue,Node* node,int enumtype){ 878 878 879 879 Input* input=inputs->GetInput(enumtype); 880 880 if(!input) _error_("No input of type %s found in tria",EnumToStringx(enumtype)); … … 887 887 } 888 888 /*}}}*/ 889 889 /*FUNCTION Penta::GetPhi {{{*/ 890 void Penta::GetPhi( double* phi, double* epsilon, double viscosity){890 void Penta::GetPhi(IssmDouble* phi, IssmDouble* epsilon, IssmDouble viscosity){ 891 891 /*Compute deformational heating from epsilon and viscosity */ 892 892 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]; 896 896 897 897 /* Build epsilon matrix */ 898 898 epsilon_matrix[0][0]=*(epsilon+0); … … 977 977 } 978 978 /*}}}*/ 979 979 /*FUNCTION Penta::GetStabilizationParameter {{{*/ 980 double Penta::GetStabilizationParameter(double u, double v, double w, double diameter, double kappa){980 IssmDouble Penta::GetStabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa){ 981 981 /*Compute stabilization parameter*/ 982 982 /*kappa=thermalconductivity/(rho_ice*hearcapacity) for thermal model*/ 983 983 /*kappa=enthalpydiffusionparameter for enthalpy model*/ 984 984 985 double normu;986 double tau_parameter;985 IssmDouble normu; 986 IssmDouble tau_parameter; 987 987 988 988 normu=pow(pow(u,2)+pow(v,2)+pow(w,2),0.5); 989 989 if(normu*diameter/(3*2*kappa)<1){ … … 995 995 } 996 996 /*}}}*/ 997 997 /*FUNCTION Penta::GetStrainRate3dPattyn{{{*/ 998 void Penta::GetStrainRate3dPattyn( double* epsilon,double* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input){998 void Penta::GetStrainRate3dPattyn(IssmDouble* epsilon,IssmDouble* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input){ 999 999 /*Compute the 3d Blatter/PattynStrain Rate (5 components): 1000 1000 * 1001 1001 * epsilon=[exx eyy exy exz eyz] … … 1007 1007 */ 1008 1008 1009 1009 int i; 1010 double epsilonvx[5];1011 double epsilonvy[5];1010 IssmDouble epsilonvx[5]; 1011 IssmDouble epsilonvy[5]; 1012 1012 1013 1013 /*Check that both inputs have been found*/ 1014 1014 if (!vx_input || !vy_input){ … … 1024 1024 } 1025 1025 /*}}}*/ 1026 1026 /*FUNCTION Penta::GetStrainRate3d{{{*/ 1027 void Penta::GetStrainRate3d( double* epsilon,double* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input, Input* vz_input){1027 void Penta::GetStrainRate3d(IssmDouble* epsilon,IssmDouble* xyz_list, GaussPenta* gauss, Input* vx_input, Input* vy_input, Input* vz_input){ 1028 1028 /*Compute the 3d Strain Rate (6 components): 1029 1029 * 1030 1030 * epsilon=[exx eyy ezz exy exz eyz] 1031 1031 */ 1032 1032 1033 1033 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]; 1037 1037 1038 1038 /*Check that both inputs have been found*/ 1039 1039 if (!vx_input || !vy_input || !vz_input){ … … 1099 1099 } 1100 1100 /*}}}*/ 1101 1101 /*FUNCTION Penta::GetZcoord {{{*/ 1102 double Penta::GetZcoord(GaussPenta* gauss){1102 IssmDouble Penta::GetZcoord(GaussPenta* gauss){ 1103 1103 1104 1104 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]; 1108 1108 1109 1109 GetVerticesCoordinates(&xyz_list[0][0], nodes, NUMVERTICES); 1110 1110 for(i=0;i<NUMVERTICES;i++) z_list[i]=xyz_list[i][2]; … … 1126 1126 } 1127 1127 /*}}}*/ 1128 1128 /*FUNCTION Penta::InputArtificialNoise{{{*/ 1129 void Penta::InputArtificialNoise(int enum_type, double min,double max){1129 void Penta::InputArtificialNoise(int enum_type,IssmDouble min,IssmDouble max){ 1130 1130 1131 1131 Input* input=NULL; 1132 1132 … … 1139 1139 } 1140 1140 /*}}}*/ 1141 1141 /*FUNCTION Penta::InputConvergence{{{*/ 1142 bool Penta::InputConvergence( double* eps, int* enums,int num_enums,int* criterionenums,double* criterionvalues,int num_criterionenums){1142 bool Penta::InputConvergence(IssmDouble* eps, int* enums,int num_enums,int* criterionenums,IssmDouble* criterionvalues,int num_criterionenums){ 1143 1143 1144 1144 int i; 1145 1145 bool converged=true; … … 1170 1170 return converged; 1171 1171 } 1172 1172 /*}}}*/ 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);{{{*/ 1174 void Penta::InputCreate(IssmDouble scalar,int name,int code){ 1175 1175 1176 1176 /*Check that name is an element input*/ 1177 1177 if (!IsInput(name)) return; … … 1182 1182 else if ((code==6) || (code==2)){ //integer 1183 1183 this->inputs->AddInput(new IntInput(name,(int)scalar)); 1184 1184 } 1185 else if ((code==7) || (code==3)){ // double1186 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)); 1187 1187 } 1188 1188 else _error_("%s%i"," could not recognize nature of vector from code ",code); 1189 1189 1190 1190 } 1191 1191 /*}}}*/ 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 elements1192 /*FUNCTION Penta::InputCreate(IssmDouble* vector,int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){{{*/ 1193 void Penta::InputCreate(IssmDouble* vector, int index,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code){//index into elements 1194 1194 1195 1195 /*Intermediaries*/ 1196 1196 int i,j,t; 1197 1197 int penta_vertex_ids[6]; 1198 1198 int row; 1199 double nodeinputs[6];1200 double time;1199 IssmDouble nodeinputs[6]; 1200 IssmDouble time; 1201 1201 TransientInput* transientinput=NULL; 1202 1202 1203 1203 int numberofvertices; 1204 1204 int numberofelements; 1205 double yts;1205 IssmDouble yts; 1206 1206 1207 1207 /*Fetch parameters: */ 1208 1208 iomodel->Constant(&numberofvertices,MeshNumberofverticesEnum); … … 1221 1221 if(M==numberofvertices){ 1222 1222 1223 1223 /*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]; 1225 1225 1226 1226 /*process units: */ 1227 1227 UnitConversion(&nodeinputs[0], 6 ,ExtToIuEnum, vector_enum); … … 1236 1236 /*create input values: */ 1237 1237 for(i=0;i<6;i++){ 1238 1238 row=penta_vertex_ids[i]-1; 1239 nodeinputs[i]=( double)vector[N*row+t];1239 nodeinputs[i]=(IssmDouble)vector[N*row+t]; 1240 1240 } 1241 1241 1242 1242 /*process units: */ 1243 1243 UnitConversion(&nodeinputs[0], 6 ,ExtToIuEnum, vector_enum); 1244 1244 1245 1245 /*time? :*/ 1246 time=( double)vector[(M-1)*N+t]*yts;1246 time=(IssmDouble)vector[(M-1)*N+t]*yts; 1247 1247 1248 1248 if(t==0)transientinput=new TransientInput(vector_enum); 1249 1249 transientinput->AddTimeInput(new PentaP1Input(vector_enum,nodeinputs),time); … … 1264 1264 else if (code==6){ //integer 1265 1265 this->inputs->AddInput(new IntInput(vector_enum,(int)vector[index])); 1266 1266 } 1267 else if (code==7){ // double1268 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])); 1269 1269 } 1270 1270 else _error_("%s%i"," could not recognize nature of vector from code ",code); 1271 1271 } … … 1283 1283 void Penta::InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum){ 1284 1284 1285 1285 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}; 1289 1289 Penta* penta=NULL; 1290 1290 Input* original_input=NULL; 1291 1291 Input* element_integrated_input=NULL; … … 1457 1457 } 1458 1458 /*}}}*/ 1459 1459 /*FUNCTION Penta::InputScale{{{*/ 1460 void Penta::InputScale(int enum_type, double scale_factor){1460 void Penta::InputScale(int enum_type,IssmDouble scale_factor){ 1461 1461 1462 1462 Input* input=NULL; 1463 1463 … … 1470 1470 } 1471 1471 /*}}}*/ 1472 1472 /*FUNCTION Penta::InputToResult{{{*/ 1473 void Penta::InputToResult(int enum_type,int step, double time){1473 void Penta::InputToResult(int enum_type,int step,IssmDouble time){ 1474 1474 1475 1475 int i; 1476 1476 bool found = false; … … 1504 1504 this->inputs->AddInput(new BoolInput(name,constant)); 1505 1505 } 1506 1506 /*}}}*/ 1507 /*FUNCTION Penta::InputUpdateFromConstant( double value, int name);{{{*/1508 void Penta::InputUpdateFromConstant( double constant, int name){1507 /*FUNCTION Penta::InputUpdateFromConstant(IssmDouble value, int name);{{{*/ 1508 void Penta::InputUpdateFromConstant(IssmDouble constant, int name){ 1509 1509 /*Check that name is an element input*/ 1510 1510 if (!IsInput(name)) return; 1511 1511 … … 1528 1528 /*Intermediaries*/ 1529 1529 IssmInt i,j; 1530 1530 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]; 1534 1534 1535 double yts;1535 IssmDouble yts; 1536 1536 bool control_analysis; 1537 1537 int num_control_type; 1538 1538 int num_cm_responses; … … 1646 1646 } 1647 1647 /*}}}*/ 1648 1648 /*FUNCTION Penta::InputUpdateFromSolution {{{*/ 1649 void Penta::InputUpdateFromSolution( double* solution){1649 void Penta::InputUpdateFromSolution(IssmDouble* solution){ 1650 1650 1651 1651 int analysis_type; 1652 1652 … … 1715 1715 } 1716 1716 /*}}}*/ 1717 1717 /*FUNCTION Penta::InputUpdateFromSolutionPrognostic{{{*/ 1718 void Penta::InputUpdateFromSolutionPrognostic( double* solution){1718 void Penta::InputUpdateFromSolutionPrognostic(IssmDouble* solution){ 1719 1719 1720 1720 const int numdof = NDOF1*NUMVERTICES; 1721 1721 const int numdof2d = NDOF1*NUMVERTICES2D; 1722 1722 1723 1723 int i,hydroadjustment; 1724 1724 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]; 1732 1732 Penta *penta = NULL; 1733 1733 1734 1734 /*If not on bed, return*/ … … 1798 1798 } 1799 1799 /*}}}*/ 1800 1800 /*FUNCTION Penta::InputUpdateFromSolutionOneDof{{{*/ 1801 void Penta::InputUpdateFromSolutionOneDof( double* solution,int enum_type){1801 void Penta::InputUpdateFromSolutionOneDof(IssmDouble* solution,int enum_type){ 1802 1802 1803 1803 const int numdof = NDOF1*NUMVERTICES; 1804 1804 1805 double values[numdof];1805 IssmDouble values[numdof]; 1806 1806 int* doflist=NULL; 1807 1807 1808 1808 /*Get dof list: */ … … 1822 1822 } 1823 1823 /*}}}*/ 1824 1824 /*FUNCTION Penta::InputUpdateFromSolutionOneDofCollpased{{{*/ 1825 void Penta::InputUpdateFromSolutionOneDofCollapsed( double* solution,int enum_type){1825 void Penta::InputUpdateFromSolutionOneDofCollapsed(IssmDouble* solution,int enum_type){ 1826 1826 1827 1827 const int numdof = NDOF1*NUMVERTICES; 1828 1828 const int numdof2d = NDOF1*NUMVERTICES2D; 1829 1829 1830 double values[numdof];1830 IssmDouble values[numdof]; 1831 1831 int* doflist = NULL; 1832 1832 Penta *penta = NULL; 1833 1833 … … 1861 1861 xDelete<int>(doflist); 1862 1862 } 1863 1863 /*}}}*/ 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);{{{*/ 1865 void Penta::InputUpdateFromVector(IssmDouble* vector, int name, int type){ 1866 1866 1867 1867 /*Check that name is an element input*/ 1868 1868 if (!IsInput(name)) return; … … 1874 1874 case VertexEnum: 1875 1875 1876 1876 /*New PentaVertexInpu*/ 1877 double values[6];1877 IssmDouble values[6]; 1878 1878 1879 1879 /*Get values on the 6 vertices*/ 1880 1880 for (int i=0;i<6;i++){ … … 1977 1977 } 1978 1978 /*}}}*/ 1979 1979 /*FUNCTION Penta::IsNodeOnShelfFromFlags {{{*/ 1980 bool Penta::IsNodeOnShelfFromFlags( double* flags){1980 bool Penta::IsNodeOnShelfFromFlags(IssmDouble* flags){ 1981 1981 1982 1982 int i; 1983 1983 bool shelf=false; … … 2008 2008 } 2009 2009 /*}}}*/ 2010 2010 /*FUNCTION Penta::ListResultsInfo{{{*/ 2011 void Penta::ListResultsInfo(int** in_resultsenums,int** in_resultssizes, double** in_resultstimes,int** in_resultssteps,int* in_num_results){2011 void Penta::ListResultsInfo(int** in_resultsenums,int** in_resultssizes,IssmDouble** in_resultstimes,int** in_resultssteps,int* in_num_results){ 2012 2012 2013 2013 /*Intermediaries*/ 2014 2014 int i; 2015 2015 int numberofresults = 0; 2016 2016 int *resultsenums = NULL; 2017 2017 int *resultssizes = NULL; 2018 double *resultstimes = NULL;2018 IssmDouble *resultstimes = NULL; 2019 2019 int *resultssteps = NULL; 2020 2020 2021 2021 /*Checks*/ … … 2032 2032 /*Allocate output*/ 2033 2033 resultsenums=xNew<int>(numberofresults); 2034 2034 resultssizes=xNew<int>(numberofresults); 2035 resultstimes=xNew< double>(numberofresults);2035 resultstimes=xNew<IssmDouble>(numberofresults); 2036 2036 resultssteps=xNew<int>(numberofresults); 2037 2037 2038 2038 /*populate enums*/ … … 2059 2059 2060 2060 }/*}}}*/ 2061 2061 /*FUNCTION Penta::MigrateGroundingLine{{{*/ 2062 void Penta::MigrateGroundingLine( double* old_floating_ice,double* sheet_ungrounding){2062 void Penta::MigrateGroundingLine(IssmDouble* old_floating_ice,IssmDouble* sheet_ungrounding){ 2063 2063 2064 2064 int i,migration_style,unground; 2065 2065 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]; 2070 2070 2071 2071 if(!IsOnBed()) return; 2072 2072 … … 2142 2142 } 2143 2143 /*}}}*/ 2144 2144 /*FUNCTION Penta::MinEdgeLength{{{*/ 2145 double Penta::MinEdgeLength(double xyz_list[6][3]){2145 IssmDouble Penta::MinEdgeLength(IssmDouble xyz_list[6][3]){ 2146 2146 /*Return the minimum lenght of the nine egdes of the penta*/ 2147 2147 2148 2148 int i,node0,node1; 2149 2149 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; 2152 2152 2153 2153 for(i=0;i<9;i++){ 2154 2154 /*Find the two nodes for this edge*/ … … 2170 2170 } 2171 2171 /*}}}*/ 2172 2172 /*FUNCTION Penta::NodalValue {{{*/ 2173 int Penta::NodalValue( double* pvalue, int index, int natureofdataenum,bool process_units){2173 int Penta::NodalValue(IssmDouble* pvalue, int index, int natureofdataenum,bool process_units){ 2174 2174 2175 2175 int i; 2176 2176 int found=0; 2177 double value;2177 IssmDouble value; 2178 2178 Input* data=NULL; 2179 2179 GaussPenta* gauss=NULL; 2180 2180 … … 2252 2252 } 2253 2253 /*}}}*/ 2254 2254 /*FUNCTION Penta::PositiveDegreeDay{{{*/ 2255 void Penta::PositiveDegreeDay( double* pdds,double* pds,double signorm){2255 void Penta::PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm){ 2256 2256 2257 2257 2258 2258 int i,iqj,imonth; 2259 double agd[NUMVERTICES]; // surface and basal2260 double saccu[NUMVERTICES] = {0}; // yearly surface accumulation2261 double smelt[NUMVERTICES] = {0}; // yearly melt2262 double precrunoff[NUMVERTICES]; // yearly runoff2263 double prect; // total precipitation during 1 year taking into account des. ef.2264 double water; //water=rain + snowmelt2265 double runoff; //meltwater only, does not include rain2266 double sconv; //rhow_rain/rhoi / 12 months2259 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 2267 2267 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 factor2271 double s0p[NUMVERTICES]={0}; //should be set to elevation from precip source2272 double s0t[NUMVERTICES]={0}; //should be set to elevation from temperature source2273 double st; // elevation between altitude of the temp record and current altitude2274 double sp; // elevation between altitude of the prec record and current altitude2268 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 2275 2275 2276 2276 2277 2277 // PDD and PD constants and variables 2278 double siglim; // sigma limit for the integration which is equal to 2.5 sigmanorm2279 double signormc = signorm - 0.5; // sigma of the temperature distribution for cloudy day2280 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 snow2278 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 2284 2284 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 precipitation2287 double qmt[NUMVERTICES] = {0}; // precipitation without desertification effect adjustment2288 double qmp[NUMVERTICES] = {0}; // desertification taken into account2289 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}; 2291 2291 2292 double tstar; // monthly mean surface temp2293 double Tsum[NUMVERTICES]= {0}; // average summer (JJA) temperature2294 double Tsurf[NUMVERTICES] = {0}; // average annual temperature2292 IssmDouble tstar; // monthly mean surface temp 2293 IssmDouble Tsum[NUMVERTICES]= {0}; // average summer (JJA) temperature 2294 IssmDouble Tsurf[NUMVERTICES] = {0}; // average annual temperature 2295 2295 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; 2299 2299 int ismon[12]={12,1,2,3,4,5,6,7,8,9,10,11}; 2300 2300 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). 2304 2304 2305 double dfrz=1.5, CovrLm=2009./3.35e+5, dCovrLm=dfrz*CovrLm; //m*J kg^-1 C^-1 /(J kg^-1)=m/C yr2306 double supice,supcap,diffndd;2307 double fsupT=0.5, fsupndd=0.5; // Tsurf mode factors for supice2308 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; 2309 2309 2310 2310 /*Recover info at the vertices: */ 2311 2311 GetInputListOnVertices(&h[0],ThicknessEnum); … … 2480 2480 void Penta::PotentialSheetUngrounding(Vector* potential_sheet_ungrounding){ 2481 2481 2482 2482 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; 2486 2486 bool elementonshelf = false; 2487 2487 2488 2488 /*material parameters: */ … … 2517 2517 } 2518 2518 /*}}}*/ 2519 2519 /*FUNCTION Penta::ReduceMatrixStokes {{{*/ 2520 void Penta::ReduceMatrixStokes( double* Ke_reduced, double* Ke_temp){2520 void Penta::ReduceMatrixStokes(IssmDouble* Ke_reduced, IssmDouble* Ke_temp){ 2521 2521 2522 2522 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]; 2529 2529 2530 2530 /*Create the four matrices used for reduction */ 2531 2531 for(i=0;i<24;i++){ … … 2559 2559 } 2560 2560 /*}}}*/ 2561 2561 /*FUNCTION Penta::ReduceVectorStokes {{{*/ 2562 void Penta::ReduceVectorStokes( double* Pe_reduced, double* Ke_temp, double* Pe_temp){2562 void Penta::ReduceVectorStokes(IssmDouble* Pe_reduced, IssmDouble* Ke_temp, IssmDouble* Pe_temp){ 2563 2563 2564 2564 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]; 2571 2571 2572 2572 /*Create the four matrices used for reduction */ 2573 2573 for(i=0;i<24;i++) Pi[i]=*(Pe_temp+i); … … 2594 2594 } 2595 2595 /*}}}*/ 2596 2596 /*FUNCTION Penta::RequestedOutput{{{*/ 2597 void Penta::RequestedOutput(int output_enum,int step, double time){2597 void Penta::RequestedOutput(int output_enum,int step,IssmDouble time){ 2598 2598 2599 2599 if(IsInput(output_enum)){ 2600 2600 /*just transfer this input to results, and we are done: */ … … 2648 2648 void Penta::ResetCoordinateSystem(void){ 2649 2649 2650 2650 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]; 2654 2654 2655 2655 /*For Stokes only: we want the CS to be tangential to the bedrock*/ 2656 2656 inputs->GetInputValue(&approximation,ApproximationEnum); … … 2738 2738 } 2739 2739 /*}}}*/ 2740 2740 /*FUNCTION Penta::SurfaceArea {{{*/ 2741 double Penta::SurfaceArea(void){2741 IssmDouble Penta::SurfaceArea(void){ 2742 2742 2743 2743 int approximation; 2744 double S;2744 IssmDouble S; 2745 2745 Tria* tria=NULL; 2746 2746 2747 2747 /*retrieve inputs :*/ … … 2775 2775 } 2776 2776 /*}}}*/ 2777 2777 /*FUNCTION Penta::SurfaceNormal {{{*/ 2778 void Penta::SurfaceNormal( double* surface_normal, double xyz_list[3][3]){2778 void Penta::SurfaceNormal(IssmDouble* surface_normal, IssmDouble xyz_list[3][3]){ 2779 2779 2780 2780 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; 2784 2784 2785 2785 for (i=0;i<3;i++){ 2786 2786 v13[i]=xyz_list[0][i]-xyz_list[2][i]; … … 2799 2799 } 2800 2800 /*}}}*/ 2801 2801 /*FUNCTION Penta::TimeAdapt{{{*/ 2802 double Penta::TimeAdapt(void){2802 IssmDouble Penta::TimeAdapt(void){ 2803 2803 2804 2804 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]; 2809 2809 2810 2810 /*get CFL coefficient:*/ 2811 2811 this->parameters->FindParam(&C,TimesteppingCflCoefficientEnum); … … 2850 2850 int penta_type; 2851 2851 int penta_node_ids[6]; 2852 2852 int penta_vertex_ids[6]; 2853 double nodeinputs[6];2854 double yts;2853 IssmDouble nodeinputs[6]; 2854 IssmDouble yts; 2855 2855 int stabilization; 2856 2856 bool dakota_analysis; 2857 2857 bool isstokes; 2858 double beta,heatcapacity,referencetemperature,meltingpoint,latentheat;2858 IssmDouble beta,heatcapacity,referencetemperature,meltingpoint,latentheat; 2859 2859 2860 2860 /*Fetch parameters: */ 2861 2861 iomodel->Constant(&yts,ConstantsYtsEnum); … … 2997 2997 } 2998 2998 /*}}}*/ 2999 2999 /*FUNCTION Penta::UpdatePotentialSheetUngrounding{{{*/ 3000 int Penta::UpdatePotentialSheetUngrounding( double* vertices_potentially_ungrounding,Vector* vec_nodes_on_iceshelf,double* nodes_on_iceshelf){3000 int Penta::UpdatePotentialSheetUngrounding(IssmDouble* vertices_potentially_ungrounding,Vector* vec_nodes_on_iceshelf,IssmDouble* nodes_on_iceshelf){ 3001 3001 3002 3002 int i; 3003 3003 int nflipped=0; … … 3024 3024 3025 3025 /*Intermediaries*/ 3026 3026 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; 3033 3033 GaussPenta *gauss=NULL; 3034 3034 3035 3035 /*Initialize Element vector*/ … … 3065 3065 } 3066 3066 /*}}}*/ 3067 3067 /*FUNCTION Penta::SmearFunction {{{*/ 3068 void Penta::SmearFunction(Vector* smearedvector, double (*WeightFunction)(double distance,double radius),double radius){3068 void Penta::SmearFunction(Vector* smearedvector,IssmDouble (*WeightFunction)(IssmDouble distance,IssmDouble radius),IssmDouble radius){ 3069 3069 _error_("not implemented yet"); 3070 3070 } 3071 3071 /*}}}*/ 3072 3072 3073 3073 #ifdef _HAVE_RESPONSES_ 3074 3074 /*FUNCTION Penta::IceVolume {{{*/ 3075 double Penta::IceVolume(void){3075 IssmDouble Penta::IceVolume(void){ 3076 3076 3077 3077 /*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]; 3080 3080 3081 3081 if(IsOnWater())return 0; 3082 3082 … … 3095 3095 } 3096 3096 /*}}}*/ 3097 3097 /*FUNCTION Penta::MinVel{{{*/ 3098 void Penta::MinVel( double* pminvel, bool process_units){3098 void Penta::MinVel(IssmDouble* pminvel, bool process_units){ 3099 3099 3100 3100 /*Get minimum:*/ 3101 double minvel=this->inputs->Min(VelEnum);3101 IssmDouble minvel=this->inputs->Min(VelEnum); 3102 3102 3103 3103 /*process units if requested: */ 3104 3104 if(process_units) minvel=UnitConversion(minvel,IuToExtEnum,VelEnum); … … 3108 3108 } 3109 3109 /*}}}*/ 3110 3110 /*FUNCTION Penta::MinVx{{{*/ 3111 void Penta::MinVx( double* pminvx, bool process_units){3111 void Penta::MinVx(IssmDouble* pminvx, bool process_units){ 3112 3112 3113 3113 /*Get minimum:*/ 3114 double minvx=this->inputs->Min(VxEnum);3114 IssmDouble minvx=this->inputs->Min(VxEnum); 3115 3115 3116 3116 /*process units if requested: */ 3117 3117 if(process_units) minvx=UnitConversion(minvx,IuToExtEnum,VxEnum); … … 3121 3121 } 3122 3122 /*}}}*/ 3123 3123 /*FUNCTION Penta::MinVy{{{*/ 3124 void Penta::MinVy( double* pminvy, bool process_units){3124 void Penta::MinVy(IssmDouble* pminvy, bool process_units){ 3125 3125 3126 3126 /*Get minimum:*/ 3127 double minvy=this->inputs->Min(VyEnum);3127 IssmDouble minvy=this->inputs->Min(VyEnum); 3128 3128 3129 3129 /*process units if requested: */ 3130 3130 if(process_units) minvy=UnitConversion(minvy,IuToExtEnum,VyEnum); … … 3134 3134 } 3135 3135 /*}}}*/ 3136 3136 /*FUNCTION Penta::MinVz{{{*/ 3137 void Penta::MinVz( double* pminvz, bool process_units){3137 void Penta::MinVz(IssmDouble* pminvz, bool process_units){ 3138 3138 3139 3139 /*Get minimum:*/ 3140 double minvz=this->inputs->Min(VzEnum);3140 IssmDouble minvz=this->inputs->Min(VzEnum); 3141 3141 3142 3142 /*process units if requested: */ 3143 3143 if(process_units) minvz=UnitConversion(minvz,IuToExtEnum,VzEnum); … … 3147 3147 } 3148 3148 /*}}}*/ 3149 3149 /*FUNCTION Penta::MassFlux {{{*/ 3150 double Penta::MassFlux( double* segment,bool process_units){3150 IssmDouble Penta::MassFlux( IssmDouble* segment,bool process_units){ 3151 3151 3152 double mass_flux=0;3152 IssmDouble mass_flux=0; 3153 3153 3154 3154 if(!IsOnBed()) return mass_flux; 3155 3155 … … 3171 3171 } 3172 3172 /*}}}*/ 3173 3173 /*FUNCTION Penta::MaxAbsVx{{{*/ 3174 void Penta::MaxAbsVx( double* pmaxabsvx, bool process_units){3174 void Penta::MaxAbsVx(IssmDouble* pmaxabsvx, bool process_units){ 3175 3175 3176 3176 /*Get maximum:*/ 3177 double maxabsvx=this->inputs->MaxAbs(VxEnum);3177 IssmDouble maxabsvx=this->inputs->MaxAbs(VxEnum); 3178 3178 3179 3179 /*process units if requested: */ 3180 3180 if(process_units) maxabsvx=UnitConversion(maxabsvx,IuToExtEnum,VxEnum); … … 3184 3184 } 3185 3185 /*}}}*/ 3186 3186 /*FUNCTION Penta::MaxAbsVy{{{*/ 3187 void Penta::MaxAbsVy( double* pmaxabsvy, bool process_units){3187 void Penta::MaxAbsVy(IssmDouble* pmaxabsvy, bool process_units){ 3188 3188 3189 3189 /*Get maximum:*/ 3190 double maxabsvy=this->inputs->MaxAbs(VyEnum);3190 IssmDouble maxabsvy=this->inputs->MaxAbs(VyEnum); 3191 3191 3192 3192 /*process units if requested: */ 3193 3193 if(process_units) maxabsvy=UnitConversion(maxabsvy,IuToExtEnum,VyEnum); … … 3197 3197 } 3198 3198 /*}}}*/ 3199 3199 /*FUNCTION Penta::MaxAbsVz{{{*/ 3200 void Penta::MaxAbsVz( double* pmaxabsvz, bool process_units){3200 void Penta::MaxAbsVz(IssmDouble* pmaxabsvz, bool process_units){ 3201 3201 3202 3202 /*Get maximum:*/ 3203 double maxabsvz=this->inputs->MaxAbs(VzEnum);3203 IssmDouble maxabsvz=this->inputs->MaxAbs(VzEnum); 3204 3204 3205 3205 /*process units if requested: */ 3206 3206 if(process_units) maxabsvz=UnitConversion(maxabsvz,IuToExtEnum,VyEnum); … … 3210 3210 } 3211 3211 /*}}}*/ 3212 3212 /*FUNCTION Penta::MaxVel{{{*/ 3213 void Penta::MaxVel( double* pmaxvel, bool process_units){3213 void Penta::MaxVel(IssmDouble* pmaxvel, bool process_units){ 3214 3214 3215 3215 /*Get maximum:*/ 3216 double maxvel=this->inputs->Max(VelEnum);3216 IssmDouble maxvel=this->inputs->Max(VelEnum); 3217 3217 3218 3218 /*process units if requested: */ 3219 3219 if(process_units) maxvel=UnitConversion(maxvel,IuToExtEnum,VelEnum); … … 3224 3224 } 3225 3225 /*}}}*/ 3226 3226 /*FUNCTION Penta::MaxVx{{{*/ 3227 void Penta::MaxVx( double* pmaxvx, bool process_units){3227 void Penta::MaxVx(IssmDouble* pmaxvx, bool process_units){ 3228 3228 3229 3229 /*Get maximum:*/ 3230 double maxvx=this->inputs->Max(VxEnum);3230 IssmDouble maxvx=this->inputs->Max(VxEnum); 3231 3231 3232 3232 /*process units if requested: */ 3233 3233 if(process_units) maxvx=UnitConversion(maxvx,IuToExtEnum,VxEnum); … … 3237 3237 } 3238 3238 /*}}}*/ 3239 3239 /*FUNCTION Penta::MaxVy{{{*/ 3240 void Penta::MaxVy( double* pmaxvy, bool process_units){3240 void Penta::MaxVy(IssmDouble* pmaxvy, bool process_units){ 3241 3241 3242 3242 /*Get maximum:*/ 3243 double maxvy=this->inputs->Max(VyEnum);3243 IssmDouble maxvy=this->inputs->Max(VyEnum); 3244 3244 3245 3245 /*process units if requested: */ 3246 3246 if(process_units) maxvy=UnitConversion(maxvy,IuToExtEnum,VyEnum); … … 3250 3250 } 3251 3251 /*}}}*/ 3252 3252 /*FUNCTION Penta::MaxVz{{{*/ 3253 void Penta::MaxVz( double* pmaxvz, bool process_units){3253 void Penta::MaxVz(IssmDouble* pmaxvz, bool process_units){ 3254 3254 3255 3255 /*Get maximum:*/ 3256 double maxvz=this->inputs->Max(VzEnum);3256 IssmDouble maxvz=this->inputs->Max(VzEnum); 3257 3257 3258 3258 /*process units if requested: */ 3259 3259 if(process_units) maxvz=UnitConversion(maxvz,IuToExtEnum,VzEnum); … … 3263 3263 } 3264 3264 /*}}}*/ 3265 3265 /*FUNCTION Penta::ElementResponse{{{*/ 3266 void Penta::ElementResponse( double* presponse,int response_enum,bool process_units){3266 void Penta::ElementResponse(IssmDouble* presponse,int response_enum,bool process_units){ 3267 3267 3268 3268 switch(response_enum){ 3269 3269 case MaterialsRheologyBbarEnum: … … 3272 3272 case VelEnum: 3273 3273 3274 3274 /*Get input:*/ 3275 double vel;3275 IssmDouble vel; 3276 3276 Input* vel_input; 3277 3277 3278 3278 vel_input=this->inputs->GetInput(VelEnum); _assert_(vel_input); … … 3315 3315 /*Intermediaries */ 3316 3316 int stabilization; 3317 3317 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}; 3336 3336 Tria* tria=NULL; 3337 3337 GaussPenta *gauss=NULL; 3338 3338 … … 3471 3471 3472 3472 /*Intermediaries */ 3473 3473 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; 3481 3481 GaussPenta *gauss=NULL; 3482 3482 3483 3483 /*Initialize Element matrix and return if necessary*/ … … 3552 3552 /*Intermediaries */ 3553 3553 int stabilization; 3554 3554 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}; 3570 3570 Tria* tria=NULL; 3571 3571 GaussPenta *gauss=NULL; 3572 3572 … … 3704 3704 3705 3705 /*Intermediaries */ 3706 3706 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; 3714 3714 GaussPenta *gauss=NULL; 3715 3715 3716 3716 /*Initialize Element matrix and return if necessary*/ … … 3775 3775 /*Intermediaries*/ 3776 3776 int i,j,ig,found=0; 3777 3777 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]; 3791 3791 GaussPenta *gauss=NULL; 3792 3792 3793 3793 /*Initialize Element vector*/ … … 3870 3870 3871 3871 /*Intermediaries */ 3872 3872 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]; 3880 3880 GaussPenta* gauss=NULL; 3881 3881 3882 3882 /* Ice/ocean heat exchange flux on ice shelf base */ … … 3928 3928 /*Intermediaries */ 3929 3929 int i,j,ig; 3930 3930 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]; 3939 3939 Friction* friction=NULL; 3940 3940 GaussPenta* gauss=NULL; 3941 3941 GaussPenta* gaussup=NULL; … … 4038 4038 /*Intermediaries*/ 4039 4039 int i,j,ig,found=0; 4040 4040 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]; 4053 4053 GaussPenta *gauss=NULL; 4054 4054 4055 4055 /*Initialize Element vector*/ … … 4124 4124 4125 4125 /*Intermediaries */ 4126 4126 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]; 4134 4134 GaussPenta* gauss=NULL; 4135 4135 4136 4136 /* Ice/ocean heat exchange flux on ice shelf base */ … … 4182 4182 /*Intermediaries */ 4183 4183 int i,j,ig; 4184 4184 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; 4192 4192 Friction* friction=NULL; 4193 4193 GaussPenta* gauss=NULL; 4194 4194 … … 4247 4247 4248 4248 int i; 4249 4249 int* doflist=NULL; 4250 double values[numdof];4251 double temp;4250 IssmDouble values[numdof]; 4251 IssmDouble temp; 4252 4252 GaussPenta *gauss=NULL; 4253 4253 4254 4254 /*Get dof list: */ … … 4278 4278 4279 4279 int i; 4280 4280 int* doflist=NULL; 4281 double values[numdof];4282 double enthalpy;4281 IssmDouble values[numdof]; 4282 IssmDouble enthalpy; 4283 4283 GaussPenta *gauss=NULL; 4284 4284 4285 4285 /*Get dof list: */ … … 4303 4303 } 4304 4304 /*}}}*/ 4305 4305 /*FUNCTION Penta::InputUpdateFromSolutionThermal {{{*/ 4306 void Penta::InputUpdateFromSolutionThermal( double* solution){4306 void Penta::InputUpdateFromSolutionThermal(IssmDouble* solution){ 4307 4307 4308 4308 const int numdof=NDOF1*NUMVERTICES; 4309 4309 4310 4310 bool converged; 4311 4311 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; 4316 4316 int* doflist=NULL; 4317 // double pressure[numdof];4317 //IssmDouble pressure[numdof]; 4318 4318 4319 4319 /*Get dof list: */ 4320 4320 GetDofList(&doflist,NoneApproximationEnum,GsetEnum); … … 4374 4374 } 4375 4375 /*}}}*/ 4376 4376 /*FUNCTION Penta::InputUpdateFromSolutionEnthalpy {{{*/ 4377 void Penta::InputUpdateFromSolutionEnthalpy( double* solution){4377 void Penta::InputUpdateFromSolutionEnthalpy(IssmDouble* solution){ 4378 4378 4379 4379 const int numdof=NDOF1*NUMVERTICES; 4380 4380 4381 4381 bool converged=false; 4382 4382 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; 4390 4390 int* doflist=NULL; 4391 4391 4392 4392 /*Get dof list: */ … … 4475 4475 4476 4476 }/*}}}*/ 4477 4477 /*FUNCTION Penta::ControlInputScaleGradient{{{*/ 4478 void Penta::ControlInputScaleGradient(int enum_type, double scale){4478 void Penta::ControlInputScaleGradient(int enum_type,IssmDouble scale){ 4479 4479 4480 4480 Input* input=NULL; 4481 4481 … … 4491 4491 ((ControlInput*)input)->ScaleGradient(scale); 4492 4492 }/*}}}*/ 4493 4493 /*FUNCTION Penta::ControlInputSetGradient{{{*/ 4494 void Penta::ControlInputSetGradient( double* gradient,int enum_type,int control_index){4494 void Penta::ControlInputSetGradient(IssmDouble* gradient,int enum_type,int control_index){ 4495 4495 4496 4496 int doflist1[NUMVERTICES]; 4497 double grad_list[NUMVERTICES];4497 IssmDouble grad_list[NUMVERTICES]; 4498 4498 Input* grad_input=NULL; 4499 4499 Input* input=NULL; 4500 4500 … … 4565 4565 /*Intermediaries */ 4566 4566 int i,j,ig; 4567 4567 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]; 4577 4577 GaussPenta *gauss=NULL; 4578 4578 4579 4579 /*Initialize Jacobian with regular Pattyn (first part of the Gateau derivative)*/ … … 4633 4633 /*Intermediaries */ 4634 4634 int i,j,ig; 4635 4635 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]; 4646 4646 GaussPenta *gauss=NULL; 4647 4647 4648 4648 /*Initialize Jacobian with regular Stokes (first part of the Gateau derivative)*/ … … 4888 4888 int i,j,ig; 4889 4889 int analysis_type; 4890 4890 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]; 4899 4899 Friction* friction=NULL; 4900 4900 GaussPenta *gauss=NULL; 4901 4901 … … 4959 4959 int i,j,ig; 4960 4960 int analysis_type; 4961 4961 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]; 4972 4972 Friction* friction=NULL; 4973 4973 GaussPenta* gauss=NULL; 4974 4974 … … 5098 5098 this->matice->inputs->DeleteInput(MaterialsRheologyBbarEnum); 5099 5099 } /*}}}*/ 5100 5100 /*FUNCTION Penta::InputControlUpdate{{{*/ 5101 void Penta::InputControlUpdate( double scalar,bool save_parameter){5101 void Penta::InputControlUpdate(IssmDouble scalar,bool save_parameter){ 5102 5102 5103 5103 /*Intermediary*/ 5104 5104 int num_controls; … … 5136 5136 } 5137 5137 /*}}}*/ 5138 5138 /*FUNCTION Penta::InputUpdateFromSolutionAdjointStokes {{{*/ 5139 void Penta::InputUpdateFromSolutionAdjointStokes( double* solution){5139 void Penta::InputUpdateFromSolutionAdjointStokes(IssmDouble* solution){ 5140 5140 5141 5141 const int numdof=NDOF4*NUMVERTICES; 5142 5142 5143 5143 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]; 5149 5149 int* doflist=NULL; 5150 5150 5151 5151 /*Get dof list: */ … … 5179 5179 } 5180 5180 /*}}}*/ 5181 5181 /*FUNCTION Penta::InputUpdateFromSolutionAdjointHoriz {{{*/ 5182 void Penta::InputUpdateFromSolutionAdjointHoriz( double* solution){5182 void Penta::InputUpdateFromSolutionAdjointHoriz(IssmDouble* solution){ 5183 5183 5184 5184 const int numdof=NDOF2*NUMVERTICES; 5185 5185 5186 5186 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]; 5190 5190 int* doflist=NULL; 5191 5191 5192 5192 /*Get dof list: */ … … 5214 5214 } 5215 5215 /*}}}*/ 5216 5216 /*FUNCTION Penta::SurfaceAverageVelMisfit {{{*/ 5217 double Penta::SurfaceAverageVelMisfit(bool process_units,int weight_index){5217 IssmDouble Penta::SurfaceAverageVelMisfit(bool process_units,int weight_index){ 5218 5218 5219 5219 int approximation; 5220 double J;5220 IssmDouble J; 5221 5221 Tria* tria=NULL; 5222 5222 5223 5223 /*retrieve inputs :*/ … … 5251 5251 } 5252 5252 /*}}}*/ 5253 5253 /*FUNCTION Penta::SurfaceAbsVelMisfit {{{*/ 5254 double Penta::SurfaceAbsVelMisfit(bool process_units,int weight_index){5254 IssmDouble Penta::SurfaceAbsVelMisfit(bool process_units,int weight_index){ 5255 5255 5256 5256 int approximation; 5257 double J;5257 IssmDouble J; 5258 5258 Tria* tria=NULL; 5259 5259 5260 5260 /*retrieve inputs :*/ … … 5288 5288 } 5289 5289 /*}}}*/ 5290 5290 /*FUNCTION Penta::SurfaceLogVelMisfit {{{*/ 5291 double Penta::SurfaceLogVelMisfit(bool process_units,int weight_index){5291 IssmDouble Penta::SurfaceLogVelMisfit(bool process_units,int weight_index){ 5292 5292 5293 5293 int approximation; 5294 double J;5294 IssmDouble J; 5295 5295 Tria* tria=NULL; 5296 5296 5297 5297 /*retrieve inputs :*/ … … 5325 5325 } 5326 5326 /*}}}*/ 5327 5327 /*FUNCTION Penta::SurfaceLogVxVyMisfit {{{*/ 5328 double Penta::SurfaceLogVxVyMisfit(bool process_units,int weight_index){5328 IssmDouble Penta::SurfaceLogVxVyMisfit(bool process_units,int weight_index){ 5329 5329 5330 double J;5330 IssmDouble J; 5331 5331 Tria* tria=NULL; 5332 5332 5333 5333 /*inputs: */ … … 5364 5364 } 5365 5365 /*}}}*/ 5366 5366 /*FUNCTION Penta::SurfaceRelVelMisfit {{{*/ 5367 double Penta::SurfaceRelVelMisfit(bool process_units,int weight_index){5367 IssmDouble Penta::SurfaceRelVelMisfit(bool process_units,int weight_index){ 5368 5368 5369 5369 int approximation; 5370 double J;5370 IssmDouble J; 5371 5371 Tria* tria=NULL; 5372 5372 5373 5373 /*retrieve inputs :*/ … … 5401 5401 } 5402 5402 /*}}}*/ 5403 5403 /*FUNCTION Penta::ThicknessAbsGradient{{{*/ 5404 double Penta::ThicknessAbsGradient(bool process_units,int weight_index){5404 IssmDouble Penta::ThicknessAbsGradient(bool process_units,int weight_index){ 5405 5405 5406 5406 _error_("Not implemented yet"); 5407 5407 } 5408 5408 /*}}}*/ 5409 5409 /*FUNCTION Penta::ThicknessAbsMisfit {{{*/ 5410 double Penta::ThicknessAbsMisfit(bool process_units,int weight_index){5410 IssmDouble Penta::ThicknessAbsMisfit(bool process_units,int weight_index){ 5411 5411 5412 5412 int approximation; 5413 double J;5413 IssmDouble J; 5414 5414 Tria* tria=NULL; 5415 5415 5416 5416 /*retrieve inputs :*/ … … 5427 5427 } 5428 5428 /*}}}*/ 5429 5429 /*FUNCTION Penta::DragCoefficientAbsGradient{{{*/ 5430 double Penta::DragCoefficientAbsGradient(bool process_units,int weight_index){5430 IssmDouble Penta::DragCoefficientAbsGradient(bool process_units,int weight_index){ 5431 5431 5432 double J;5432 IssmDouble J; 5433 5433 Tria* tria=NULL; 5434 5434 5435 5435 /*If on water, on shelf or not on bed, skip: */ … … 5442 5442 } 5443 5443 /*}}}*/ 5444 5444 /*FUNCTION Penta::RheologyBbarAbsGradient{{{*/ 5445 double Penta::RheologyBbarAbsGradient(bool process_units,int weight_index){5445 IssmDouble Penta::RheologyBbarAbsGradient(bool process_units,int weight_index){ 5446 5446 5447 double J;5447 IssmDouble J; 5448 5448 Tria* tria=NULL; 5449 5449 5450 5450 /*If on water, on shelf or not on bed, skip: */ … … 5480 5480 } 5481 5481 /*}}}*/ 5482 5482 /*FUNCTION Penta::SetControlInputsFromVector{{{*/ 5483 void Penta::SetControlInputsFromVector( double* vector,int control_enum,int control_index){5483 void Penta::SetControlInputsFromVector(IssmDouble* vector,int control_enum,int control_index){ 5484 5484 5485 double values[NUMVERTICES];5485 IssmDouble values[NUMVERTICES]; 5486 5486 int doflist1[NUMVERTICES]; 5487 5487 Input *input = NULL; 5488 5488 Input *new_input = NULL; … … 5517 5517 #endif 5518 5518 5519 5519 #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);{{{*/ 5521 void Penta::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){ 5522 5522 5523 5523 int i,j; 5524 5524 … … 5530 5530 case VertexEnum: 5531 5531 5532 5532 /*New PentaP1Input*/ 5533 double values[6];5533 IssmDouble values[6]; 5534 5534 5535 5535 /*Get values on the 6 vertices*/ 5536 5536 for (i=0;i<6;i++){ … … 5541 5541 switch(name){ 5542 5542 case ThicknessEnum: 5543 5543 /*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]; 5549 5549 5550 5550 /*retrieve inputs: */ 5551 5551 GetInputListOnVertices(&thickness_init[0],ThicknessEnum); … … 5559 5559 /*build new bed and surface: */ 5560 5560 if (this->IsFloating()){ 5561 5561 /*hydrostatic equilibrium: */ 5562 double rho_ice,rho_water,di;5562 IssmDouble rho_ice,rho_water,di; 5563 5563 rho_ice=this->matpar->GetRhoIce(); 5564 5564 rho_water=this->matpar->GetRhoWater(); 5565 5565 … … 5629 5629 _error_(" not supported yet!"); 5630 5630 } 5631 5631 /*}}}*/ 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);{{{*/ 5633 void Penta::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols, int name, int type){ 5634 5634 5635 5635 int i,j,t; 5636 5636 TransientInput* transientinput=NULL; 5637 double values[6];5638 double time;5637 IssmDouble values[6]; 5638 IssmDouble time; 5639 5639 int row; 5640 double yts;5640 IssmDouble yts; 5641 5641 5642 5642 /*Check that name is an element input*/ 5643 5643 if (!IsInput(name)) return; … … 5655 5655 /*create input values: */ 5656 5656 for(i=0;i<6;i++){ 5657 5657 row=this->nodes[i]->GetSidList(); 5658 values[i]=( double)matrix[ncols*row+t];5658 values[i]=(IssmDouble)matrix[ncols*row+t]; 5659 5659 } 5660 5660 5661 5661 /*time? :*/ 5662 time=( double)matrix[(nrows-1)*ncols+t]*yts;5662 time=(IssmDouble)matrix[(nrows-1)*ncols+t]*yts; 5663 5663 5664 5664 if(t==0) transientinput=new TransientInput(name); 5665 5665 transientinput->AddTimeInput(new PentaP1Input(name,values),time); … … 5741 5741 5742 5742 /*Intermediaries */ 5743 5743 int i,j,ig; 5744 double Jdet;5745 double viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity5746 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 matrix5753 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. 5754 5754 GaussPenta *gauss=NULL; 5755 5755 GaussTria *gauss_tria=NULL; 5756 5756 Node *node_list[numnodes]; … … 5833 5833 5834 5834 /*Intermediaries */ 5835 5835 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 drag5844 double DL_scalar;5845 double Ke_gg[numdof][numdof] ={0.0};5846 double Ke_gg_gaussian[numdof][numdof]; //stiffness matrix contribution from drag5836 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 5847 5847 Friction *friction = NULL; 5848 5848 GaussPenta *gauss=NULL; 5849 5849 Node *node_list[numnodes]; … … 5891 5891 slope_magnitude=sqrt(pow(slope[0],2)+pow(slope[1],2)); 5892 5892 5893 5893 if (slope_magnitude>MAXSLOPE){ 5894 alpha2=pow(( double)10,MOUNTAINKEXPONENT);5894 alpha2=pow((IssmDouble)10,MOUNTAINKEXPONENT); 5895 5895 } 5896 5896 5897 5897 GetTriaJacobianDeterminant(&Jdet2d, &xyz_list_tria[0][0],gauss); … … 5946 5946 5947 5947 /*Intermediaries */ 5948 5948 int i,j,ig; 5949 double Jdet;5950 double viscosity,stokesreconditioning; //viscosity5951 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 matrix5961 double Ke_gg2[numdofm][numdofs]={0.0}; //local element stiffness matrix5962 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. 5964 5964 GaussPenta *gauss=NULL; 5965 5965 GaussTria *gauss_tria=NULL; 5966 5966 Node *node_list[numnodes]; … … 6053 6053 /*Intermediaries */ 6054 6054 int i,j,ig; 6055 6055 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]; 6070 6070 Friction* friction=NULL; 6071 6071 GaussPenta *gauss=NULL; 6072 6072 Node *node_list[numnodes]; … … 6241 6241 /*Intermediaries*/ 6242 6242 int connectivity[2]; 6243 6243 int i,i0,i1,j0,j1; 6244 double one0,one1;6244 IssmDouble one0,one1; 6245 6245 6246 6246 /*Initialize Element matrix*/ 6247 6247 ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,NoneApproximationEnum); … … 6258 6258 /*Find connectivity for the two nodes*/ 6259 6259 connectivity[0]=nodes[i]->GetConnectivity(); 6260 6260 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]; 6263 6263 6264 6264 /*Create matrix for these two nodes*/ 6265 6265 if (IsOnBed() && IsOnSurface()){ … … 6340 6340 6341 6341 /*Intermediaries */ 6342 6342 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 stokes6347 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. 6353 6353 Tria* tria=NULL; 6354 6354 Penta* pentabase=NULL; 6355 6355 GaussPenta *gauss=NULL; … … 6493 6493 /*Intermediaries */ 6494 6494 int i,j,ig; 6495 6495 int approximation; 6496 double xyz_list[NUMVERTICES][3];6497 double Jdet;6498 double viscosity,oldviscosity,newviscosity,viscosity_overshoot; //viscosity6499 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]; 6504 6504 Tria* tria=NULL; 6505 6505 GaussPenta *gauss=NULL; 6506 6506 … … 6558 6558 /*Intermediaries */ 6559 6559 int i,j,ig; 6560 6560 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 drag6569 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; 6570 6570 Friction *friction = NULL; 6571 6571 GaussPenta *gauss=NULL; 6572 6572 … … 6603 6603 // If we have a slope > 6% for this element, it means we are on a mountain. In this particular case, 6604 6604 //velocity should be = 0. To achieve this result, we set alpha2_list to a very high value: */ 6605 6605 if (slope_magnitude>MAXSLOPE){ 6606 alpha2=pow(( double)10,MOUNTAINKEXPONENT);6606 alpha2=pow((IssmDouble)10,MOUNTAINKEXPONENT); 6607 6607 } 6608 6608 6609 6609 DL_scalar=alpha2*gauss->weight*Jdet; … … 6659 6659 6660 6660 /*Intermediaries */ 6661 6661 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 bubble6662 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 6670 6670 GaussPenta *gauss=NULL; 6671 6671 6672 6672 /*If on water or not Stokes, skip stiffness: */ … … 6725 6725 /*Intermediaries */ 6726 6726 int i,j,ig; 6727 6727 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]; 6736 6736 Friction* friction=NULL; 6737 6737 GaussPenta *gauss=NULL; 6738 6738 … … 6810 6810 6811 6811 /*Intermediaries */ 6812 6812 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; 6818 6818 GaussPenta *gauss=NULL; 6819 6819 6820 6820 /*Initialize Element matrix*/ … … 6856 6856 6857 6857 /*Intermediaries */ 6858 6858 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]; 6864 6864 GaussPenta *gauss=NULL; 6865 6865 6866 6866 /*Initialize Element matrix*/ … … 6916 6916 /*Intermediaries */ 6917 6917 int i,j,ig; 6918 6918 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 penta6925 double dbasis[3][6]; //for the six nodes of the penta6919 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 6926 6926 GaussPenta *gauss=NULL; 6927 6927 6928 6928 /*Initialize Element vector and return if necessary*/ … … 6978 6978 /*Intermediaries*/ 6979 6979 int i,j,ig; 6980 6980 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 penta6981 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 6990 6990 Tria* tria=NULL; 6991 6991 Friction* friction=NULL; 6992 6992 GaussPenta *gauss=NULL; … … 7067 7067 /*Intermediaries */ 7068 7068 int i,j,ig; 7069 7069 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 penta7076 double dbasis[3][6]; //for the six nodes of the penta7070 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 7077 7077 GaussPenta *gauss=NULL; 7078 7078 7079 7079 /*Initialize Element vector and return if necessary*/ … … 7129 7129 /*Intermediaries*/ 7130 7130 int i,j,ig; 7131 7131 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 penta7132 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 7141 7141 Tria* tria=NULL; 7142 7142 Friction* friction=NULL; 7143 7143 GaussPenta *gauss=NULL; … … 7279 7279 int i,j,k,ig; 7280 7280 int node0,node1; 7281 7281 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; 7290 7290 GaussPenta* gauss=NULL; 7291 7291 7292 7292 /*Initialize Element vector*/ … … 7334 7334 GetSegmentJacobianDeterminant(&Jdet,&xyz_list_segment[0][0],gauss); 7335 7335 7336 7336 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]; 7338 7338 } 7339 7339 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]; 7341 7341 } 7342 7342 } 7343 7343 delete gauss; 7344 7344 7345 7345 //Deal with lower surface 7346 7346 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; 7348 7348 ub=constant_part*slope[0]; 7349 7349 vb=constant_part*slope[1]; 7350 7350 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]; 7353 7353 } 7354 7354 } 7355 7355 … … 7379 7379 7380 7380 /*Intermediaries*/ 7381 7381 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]; 7387 7387 GaussPenta *gauss=NULL; 7388 7388 7389 7389 /*Initialize Element vector*/ … … 7442 7442 /*Intermediaries*/ 7443 7443 int i,j,ig; 7444 7444 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 bubble7450 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 bubble7456 double Ke_temp[numdofbubble][3]={0.0}; //for the six nodes and the bubble7457 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]; 7458 7458 GaussPenta *gauss=NULL; 7459 7459 7460 7460 /*Initialize Element vector and return if necessary*/ … … 7519 7519 /*Intermediaries*/ 7520 7520 int i,j,ig; 7521 7521 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 penta7529 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; 7530 7530 GaussPenta *gauss=NULL; 7531 7531 7532 7532 /*Initialize Element vector and return if necessary*/ … … 7604 7604 /*Intermediaries*/ 7605 7605 int i,ig; 7606 7606 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]; 7612 7612 GaussPenta *gauss=NULL; 7613 7613 7614 7614 /*Initialize Element vector*/ … … 7661 7661 /*Intermediaries */ 7662 7662 int i,j,ig; 7663 7663 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]; 7670 7670 GaussPenta* gauss=NULL; 7671 7671 7672 7672 if (!IsOnBed()) return NULL; … … 7767 7767 7768 7768 /*Intermediaries */ 7769 7769 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]; 7779 7779 GaussPenta *gauss=NULL; 7780 7780 7781 7781 /*Initialize Jacobian with regular Pattyn (first part of the Gateau derivative)*/ … … 7832 7832 7833 7833 /*Intermediaries */ 7834 7834 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]; 7845 7845 GaussPenta *gauss=NULL; 7846 7846 7847 7847 /*Initialize Jacobian with regular Stokes (first part of the Gateau derivative)*/ … … 7908 7908 int i; 7909 7909 int approximation; 7910 7910 int* doflist=NULL; 7911 double vx,vy;7912 double values[numdof];7911 IssmDouble vx,vy; 7912 IssmDouble values[numdof]; 7913 7913 GaussPenta* gauss; 7914 7914 7915 7915 /*Get approximation enum and dof list: */ … … 7949 7949 7950 7950 int i; 7951 7951 int* doflist=NULL; 7952 double vx,vy;7953 double values[numdof];7952 IssmDouble vx,vy; 7953 IssmDouble values[numdof]; 7954 7954 GaussPenta* gauss=NULL; 7955 7955 7956 7956 /*Get dof list: */ … … 7985 7985 7986 7986 int i; 7987 7987 int* doflist=NULL; 7988 double vz;7989 double values[numdof];7988 IssmDouble vz; 7989 IssmDouble values[numdof]; 7990 7990 GaussPenta* gauss=NULL; 7991 7991 7992 7992 /*Get dof list: */ … … 8018 8018 8019 8019 int i; 8020 8020 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]; 8024 8024 GaussPenta *gauss; 8025 8025 8026 8026 /*Get dof list: */ … … 8057 8057 } 8058 8058 /*}}}*/ 8059 8059 /*FUNCTION Penta::InputUpdateFromSolutionDiagnosticHoriz {{{*/ 8060 void Penta::InputUpdateFromSolutionDiagnosticHoriz( double* solution){8060 void Penta::InputUpdateFromSolutionDiagnosticHoriz(IssmDouble* solution){ 8061 8061 8062 8062 int approximation; 8063 8063 … … 8093 8093 } 8094 8094 /*}}}*/ 8095 8095 /*FUNCTION Penta::InputUpdateFromSolutionDiagnosticMacAyeal {{{*/ 8096 void Penta::InputUpdateFromSolutionDiagnosticMacAyeal( double* solution){8096 void Penta::InputUpdateFromSolutionDiagnosticMacAyeal(IssmDouble* solution){ 8097 8097 8098 8098 const int numdof=NDOF2*NUMVERTICES; 8099 8099 8100 8100 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]; 8110 8110 int *doflist = NULL; 8111 8111 Penta *penta = NULL; 8112 8112 … … 8174 8174 } 8175 8175 /*}}}*/ 8176 8176 /*FUNCTION Penta::InputUpdateFromSolutionDiagnosticMacAyealPattyn {{{*/ 8177 void Penta::InputUpdateFromSolutionDiagnosticMacAyealPattyn( double* solution){8177 void Penta::InputUpdateFromSolutionDiagnosticMacAyealPattyn(IssmDouble* solution){ 8178 8178 8179 8179 const int numdof=NDOF2*NUMVERTICES; 8180 8180 const int numdof2d=NDOF2*NUMVERTICES2D; 8181 8181 8182 8182 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]; 8193 8193 int* doflistp = NULL; 8194 8194 int* doflistm = NULL; 8195 8195 Penta *penta = NULL; … … 8258 8258 } 8259 8259 /*}}}*/ 8260 8260 /*FUNCTION Penta::InputUpdateFromSolutionDiagnosticMacAyealStokes {{{*/ 8261 void Penta::InputUpdateFromSolutionDiagnosticMacAyealStokes( double* solution){8261 void Penta::InputUpdateFromSolutionDiagnosticMacAyealStokes(IssmDouble* solution){ 8262 8262 8263 8263 const int numdofm=NDOF2*NUMVERTICES; 8264 8264 const int numdofs=NDOF4*NUMVERTICES; 8265 8265 const int numdof2d=NDOF2*NUMVERTICES2D; 8266 8266 8267 8267 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]; 8279 8279 int* doflistm = NULL; 8280 8280 int* doflists = NULL; 8281 8281 Penta *penta = NULL; … … 8358 8358 } 8359 8359 /*}}}*/ 8360 8360 /*FUNCTION Penta::InputUpdateFromSolutionDiagnosticPattyn {{{*/ 8361 void Penta::InputUpdateFromSolutionDiagnosticPattyn( double* solution){8361 void Penta::InputUpdateFromSolutionDiagnosticPattyn(IssmDouble* solution){ 8362 8362 8363 8363 const int numdof=NDOF2*NUMVERTICES; 8364 8364 8365 8365 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]; 8375 8375 int* doflist = NULL; 8376 8376 8377 8377 /*Get dof list: */ … … 8432 8432 } 8433 8433 /*}}}*/ 8434 8434 /*FUNCTION Penta::InputUpdateFromSolutionDiagnosticPattynStokes {{{*/ 8435 void Penta::InputUpdateFromSolutionDiagnosticPattynStokes( double* solution){8435 void Penta::InputUpdateFromSolutionDiagnosticPattynStokes(IssmDouble* solution){ 8436 8436 8437 8437 const int numdofp=NDOF2*NUMVERTICES; 8438 8438 const int numdofs=NDOF4*NUMVERTICES; 8439 8439 8440 8440 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; 8452 8452 int* doflistp = NULL; 8453 8453 int* doflists = NULL; 8454 8454 Penta *penta = NULL; … … 8526 8526 } 8527 8527 /*}}}*/ 8528 8528 /*FUNCTION Penta::InputUpdateFromSolutionDiagnosticHutter {{{*/ 8529 void Penta::InputUpdateFromSolutionDiagnosticHutter( double* solution){8529 void Penta::InputUpdateFromSolutionDiagnosticHutter(IssmDouble* solution){ 8530 8530 8531 8531 const int numdof=NDOF2*NUMVERTICES; 8532 8532 8533 8533 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]; 8543 8543 int* doflist = NULL; 8544 8544 8545 8545 /*Get dof list: */ … … 8589 8589 } 8590 8590 /*}}}*/ 8591 8591 /*FUNCTION Penta::InputUpdateFromSolutionDiagnosticVert {{{*/ 8592 void Penta::InputUpdateFromSolutionDiagnosticVert( double* solution){8592 void Penta::InputUpdateFromSolutionDiagnosticVert(IssmDouble* solution){ 8593 8593 8594 8594 const int numdof=NDOF1*NUMVERTICES; 8595 8595 8596 8596 int i; 8597 8597 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]; 8610 8610 int* doflist = NULL; 8611 8611 8612 8612 … … 8693 8693 } 8694 8694 /*}}}*/ 8695 8695 /*FUNCTION Penta::InputUpdateFromSolutionDiagnosticStokes {{{*/ 8696 void Penta::InputUpdateFromSolutionDiagnosticStokes( double* solution){8696 void Penta::InputUpdateFromSolutionDiagnosticStokes(IssmDouble* solution){ 8697 8697 8698 8698 const int numdof=NDOF4*NUMVERTICES; 8699 8699 8700 8700 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; 8708 8708 int* doflist=NULL; 8709 8709 8710 8710 /*Get dof list: */ -
u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/PentaRef.h
22 22 void SetElementType(int type,int type_counter); 23 23 24 24 /*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");}; 61 61 62 62 }; 63 63 #endif -
u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/Penta.h
58 58 /*}}}*/ 59 59 /*Update virtual functions definitions: {{{*/ 60 60 void InputUpdateFromConstant(bool constant, int name); 61 void InputUpdateFromConstant( double constant, int name);61 void InputUpdateFromConstant(IssmDouble constant, int name); 62 62 void InputUpdateFromConstant(int constant, int name); 63 void InputUpdateFromSolution( double* solutiong);63 void InputUpdateFromSolution(IssmDouble* solutiong); 64 64 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); 66 66 void InputUpdateFromVector(int* vector, int name, int type); 67 67 #ifdef _HAVE_DAKOTA_ 68 68 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); 70 70 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); 72 72 #endif 73 73 void InputUpdateFromIoModel(int index, IoModel* iomodel); 74 74 /*}}}*/ 75 75 /*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); 77 77 void BasalFrictionCreateInput(void); 78 78 void ComputeBasalStress(Vector* sigma_b); 79 79 void ComputeStrainRate(Vector* eps); … … 86 86 void DeleteResults(void); 87 87 int GetNodeIndex(Node* node); 88 88 void GetSolutionFromInputs(Vector* solution); 89 double GetZcoord(GaussPenta* gauss);89 IssmDouble GetZcoord(GaussPenta* gauss); 90 90 void GetVectorFromInputs(Vector* vector,int name_enum); 91 91 void GetVectorFromResults(Vector* vector,int offset,int interp); 92 92 93 93 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); 98 98 void InputDepthAverageAtBase(int enum_type,int average_enum_type,int object_enum=MeshElementsEnum); 99 99 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); 101 101 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); 104 104 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); 107 107 void PatchFill(int* pcount, Patch* patch); 108 108 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); 110 110 void ProcessResultsUnits(void); 111 111 void ResetCoordinateSystem(void); 112 double SurfaceArea(void);112 IssmDouble SurfaceArea(void); 113 113 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(); 117 117 int* GetHorizontalNeighboorSids(void); 118 118 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); 120 120 121 121 #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); 136 136 #endif 137 137 138 138 #ifdef _HAVE_CONTROL_ 139 double DragCoefficientAbsGradient(bool process_units,int weight_index);139 IssmDouble DragCoefficientAbsGradient(bool process_units,int weight_index); 140 140 void GradientIndexing(int* indexing,int control_index); 141 141 void Gradj(Vector* gradient,int control_type,int control_index); 142 142 void GradjDragMacAyeal(Vector* gradient,int control_index); … … 146 146 void GradjBbarPattyn(Vector* gradient,int control_index); 147 147 void GradjBbarStokes(Vector* gradient,int control_index); 148 148 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); 150 150 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); 162 162 #endif 163 163 /*}}}*/ 164 164 /*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]); 166 166 ElementMatrix* CreateKMatrixPrognostic(void); 167 167 ElementMatrix* CreateKMatrixSlope(void); 168 168 ElementVector* CreatePVectorPrognostic(void); … … 172 172 void GetSidList(int* sidlist); 173 173 void GetConnectivityList(int* connectivity); 174 174 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); 180 180 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); 184 184 Penta* GetUpperElement(void); 185 185 Penta* GetLowerElement(void); 186 186 Penta* GetBasalElement(void); 187 187 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); 191 191 bool IsInput(int name); 192 192 bool IsOnSurface(void); 193 193 bool IsOnBed(void); 194 194 bool IsFloating(void); 195 195 bool IsNodeOnShelf(); 196 bool IsNodeOnShelfFromFlags( double* flags);196 bool IsNodeOnShelfFromFlags(IssmDouble* flags); 197 197 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); 201 201 void SetClone(int* minranks); 202 202 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]); 204 204 205 205 #ifdef _HAVE_DIAGNOSTIC_ 206 206 ElementMatrix* CreateKMatrixCouplingMacAyealPattyn(void); … … 235 235 ElementMatrix* CreateJacobianDiagnosticMacayeal2d(void); 236 236 ElementMatrix* CreateJacobianDiagnosticPattyn(void); 237 237 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); 247 247 void GetSolutionFromInputsDiagnosticHoriz(Vector* solutiong); 248 248 void GetSolutionFromInputsDiagnosticHutter(Vector* solutiong); 249 249 void GetSolutionFromInputsDiagnosticStokes(Vector* solutiong); … … 277 277 ElementVector* CreatePVectorAdjointMacAyeal(void); 278 278 ElementVector* CreatePVectorAdjointPattyn(void); 279 279 ElementVector* CreatePVectorAdjointStokes(void); 280 void InputUpdateFromSolutionAdjointHoriz( double* solutiong);281 void InputUpdateFromSolutionAdjointStokes( double* solutiong);280 void InputUpdateFromSolutionAdjointHoriz( IssmDouble* solutiong); 281 void InputUpdateFromSolutionAdjointStokes( IssmDouble* solutiong); 282 282 #endif 283 283 284 284 #ifdef _HAVE_HYDROLOGY_ … … 302 302 ElementVector* CreatePVectorThermalShelf(void); 303 303 ElementVector* CreatePVectorThermalSheet(void); 304 304 void GetSolutionFromInputsThermal(Vector* solutiong); 305 void InputUpdateFromSolutionThermal( double* solutiong);306 void InputUpdateFromSolutionEnthalpy( double* solutiong);305 void InputUpdateFromSolutionThermal( IssmDouble* solutiong); 306 void InputUpdateFromSolutionEnthalpy( IssmDouble* solutiong); 307 307 #endif 308 308 #ifdef _HAVE_BALANCED_ 309 309 ElementMatrix* CreateKMatrixBalancethickness(void); -
u/astrid-r1b/morlighe/issmuci/trunk-jpl/../trunk-jpl/src/c/objects/Elements/TriaRef.cpp
56 56 57 57 /*Reference Element numerics*/ 58 58 /*FUNCTION TriaRef::GetBMacAyeal {{{*/ 59 void TriaRef::GetBMacAyeal( double* B, double* xyz_list, GaussTria* gauss){59 void TriaRef::GetBMacAyeal(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){ 60 60 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 61 61 * For node i, Bi can be expressed in the actual coordinate system 62 62 * by: … … 69 69 */ 70 70 71 71 int i; 72 double dbasis[NDOF2][NUMNODES];72 IssmDouble dbasis[NDOF2][NUMNODES]; 73 73 74 74 /*Get dh1dh2dh3 in actual coordinate system: */ 75 75 GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss); … … 86 86 } 87 87 /*}}}*/ 88 88 /*FUNCTION TriaRef::GetBMacAyealStokes {{{*/ 89 void TriaRef::GetBMacAyealStokes( double* B, double* xyz_list, GaussTria* gauss){89 void TriaRef::GetBMacAyealStokes(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){ 90 90 91 91 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 92 92 * For node i, Bi can be expressed in the actual coordinate system … … 100 100 */ 101 101 102 102 /*Same thing in the actual coordinate system: */ 103 double dbasis[NDOF2][NUMNODES];103 IssmDouble dbasis[NDOF2][NUMNODES]; 104 104 105 105 /*Get dh1dh2dh3 in actual coordinates system : */ 106 106 GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss); … … 117 117 } 118 118 /*}}}*/ 119 119 /*FUNCTION TriaRef::GetSegmentBFlux{{{*/ 120 void TriaRef::GetSegmentBFlux( double* B,GaussTria* gauss, int index1,int index2){120 void TriaRef::GetSegmentBFlux(IssmDouble* B,GaussTria* gauss, int index1,int index2){ 121 121 /*Compute B matrix. B=[phi1 phi2 -phi3 -phi4] 122 122 * 123 123 * and phi1=phi3 phi2=phi4 … … 125 125 * We assume B has been allocated already, of size: 1x4 126 126 */ 127 127 128 double l1l3[NUMNODES];128 IssmDouble l1l3[NUMNODES]; 129 129 130 130 GetNodalFunctions(&l1l3[0],gauss); 131 131 … … 136 136 } 137 137 /*}}}*/ 138 138 /*FUNCTION TriaRef::GetSegmentBprimeFlux{{{*/ 139 void TriaRef::GetSegmentBprimeFlux( double* Bprime,GaussTria* gauss, int index1,int index2){139 void TriaRef::GetSegmentBprimeFlux(IssmDouble* Bprime,GaussTria* gauss, int index1,int index2){ 140 140 /*Compute Bprime matrix. Bprime=[phi1 phi2 phi3 phi4] 141 141 * 142 142 * and phi1=phi3 phi2=phi4 … … 144 144 * We assume Bprime has been allocated already, of size: 1x4 145 145 */ 146 146 147 double l1l3[NUMNODES];147 IssmDouble l1l3[NUMNODES]; 148 148 149 149 GetNodalFunctions(&l1l3[0],gauss); 150 150 … … 155 155 } 156 156 /*}}}*/ 157 157 /*FUNCTION TriaRef::GetBPrognostic{{{*/ 158 void TriaRef::GetBPrognostic( double* B_prog, double* xyz_list, GaussTria* gauss){158 void TriaRef::GetBPrognostic(IssmDouble* B_prog, IssmDouble* xyz_list, GaussTria* gauss){ 159 159 /*Compute B matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2. 160 160 * For node i, Bi can be expressed in the actual coordinate system 161 161 * by: … … 166 166 * We assume B_prog has been allocated already, of size: 2x(NDOF1*NUMNODES) 167 167 */ 168 168 169 double basis[NUMNODES];169 IssmDouble basis[NUMNODES]; 170 170 171 171 /*Get dh1dh2dh3 in actual coordinate system: */ 172 172 GetNodalFunctions(&basis[0],gauss); … … 179 179 } 180 180 /*}}}*/ 181 181 /*FUNCTION TriaRef::GetBprimeMacAyeal {{{*/ 182 void TriaRef::GetBprimeMacAyeal( double* Bprime, double* xyz_list, GaussTria* gauss){182 void TriaRef::GetBprimeMacAyeal(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss){ 183 183 184 184 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 185 185 * For node i, Bi' can be expressed in the actual coordinate system … … 193 193 */ 194 194 195 195 /*Same thing in the actual coordinate system: */ 196 double dbasis[NDOF2][NUMNODES];196 IssmDouble dbasis[NDOF2][NUMNODES]; 197 197 198 198 /*Get dh1dh2dh3 in actual coordinates system : */ 199 199 GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss); … … 210 210 } 211 211 /*}}}*/ 212 212 /*FUNCTION TriaRef::GetBprimeMacAyealStokes {{{*/ 213 void TriaRef::GetBprimeMacAyealStokes( double* Bprime, double* xyz_list, GaussTria* gauss){213 void TriaRef::GetBprimeMacAyealStokes(IssmDouble* Bprime, IssmDouble* xyz_list, GaussTria* gauss){ 214 214 215 215 /*Compute Bprime matrix. Bprime=[Bprime1 Bprime2 Bprime3] where Bprimei is of size 3*NDOF2. 216 216 * For node i, Bprimei can be expressed in the actual coordinate system … … 225 225 */ 226 226 227 227 /*Same thing in the actual coordinate system: */ 228 double dbasis[NDOF2][NUMNODES];228 IssmDouble dbasis[NDOF2][NUMNODES]; 229 229 230 230 /*Get dh1dh2dh3 in actual coordinates system : */ 231 231 GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss); … … 244 244 } 245 245 /*}}}*/ 246 246 /*FUNCTION TriaRef::GetBprimePrognostic{{{*/ 247 void TriaRef::GetBprimePrognostic( double* Bprime_prog, double* xyz_list, GaussTria* gauss){247 void TriaRef::GetBprimePrognostic(IssmDouble* Bprime_prog, IssmDouble* xyz_list, GaussTria* gauss){ 248 248 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 249 249 * For node i, Bi' can be expressed in the actual coordinate system 250 250 * by: … … 256 256 */ 257 257 258 258 /*Same thing in the actual coordinate system: */ 259 double dbasis[NDOF2][NUMNODES];259 IssmDouble dbasis[NDOF2][NUMNODES]; 260 260 261 261 /*Get dh1dh2dh3 in actual coordinates system : */ 262 262 GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list,gauss); … … 269 269 } 270 270 /*}}}*/ 271 271 /*FUNCTION TriaRef::GetL{{{*/ 272 void TriaRef::GetL( double* L, double* xyz_list,GaussTria* gauss,int numdof){272 void TriaRef::GetL(IssmDouble* L, IssmDouble* xyz_list,GaussTria* gauss,int numdof){ 273 273 /*Compute L matrix. L=[L1 L2 L3] where Li is square and of size numdof. 274 274 * For node i, Li can be expressed in the actual coordinate system 275 275 * by: … … 284 284 */ 285 285 286 286 int i; 287 double basis[3];287 IssmDouble basis[3]; 288 288 289 289 /*Get basis in actual coordinate system: */ 290 290 GetNodalFunctions(basis,gauss); … … 306 306 } 307 307 /*}}}*/ 308 308 /*FUNCTION TriaRef::GetJacobian{{{*/ 309 void TriaRef::GetJacobian( double* J, double* xyz_list,GaussTria* gauss){309 void TriaRef::GetJacobian(IssmDouble* J, IssmDouble* xyz_list,GaussTria* gauss){ 310 310 /*The Jacobian is constant over the element, discard the gaussian points. 311 311 * 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; 313 313 314 314 x1=*(xyz_list+NUMNODES*0+0); 315 315 y1=*(xyz_list+NUMNODES*0+1); … … 326 326 } 327 327 /*}}}*/ 328 328 /*FUNCTION TriaRef::GetSegmentJacobianDeterminant{{{*/ 329 void TriaRef::GetSegmentJacobianDeterminant( double* Jdet, double* xyz_list,GaussTria* gauss){329 void TriaRef::GetSegmentJacobianDeterminant(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss){ 330 330 /*The Jacobian determinant is constant over the element, discard the gaussian points. 331 331 * J is assumed to have been allocated*/ 332 double x1,y1,x2,y2;332 IssmDouble x1,y1,x2,y2; 333 333 334 334 x1=*(xyz_list+3*0+0); 335 335 y1=*(xyz_list+3*0+1); … … 342 342 } 343 343 /*}}}*/ 344 344 /*FUNCTION TriaRef::GetJacobianDeterminant2d{{{*/ 345 void TriaRef::GetJacobianDeterminant2d( double* Jdet, double* xyz_list,GaussTria* gauss){345 void TriaRef::GetJacobianDeterminant2d(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss){ 346 346 /*The Jacobian determinant is constant over the element, discard the gaussian points. 347 347 * J is assumed to have been allocated of size NDOF2xNDOF2.*/ 348 double J[2][2];348 IssmDouble J[2][2]; 349 349 350 350 /*Get Jacobian*/ 351 351 GetJacobian(&J[0][0],xyz_list,gauss); … … 357 357 } 358 358 /*}}}*/ 359 359 /*FUNCTION TriaRef::GetJacobianDeterminant3d {{{*/ 360 void TriaRef::GetJacobianDeterminant3d( double* Jdet, double* xyz_list,GaussTria* gauss){360 void TriaRef::GetJacobianDeterminant3d(IssmDouble* Jdet, IssmDouble* xyz_list,GaussTria* gauss){ 361 361 /*The Jacobian determinant is constant over the element, discard the gaussian points. 362 362 * J is assumed to have been allocated of size NDOF2xNDOF2.*/ 363 363 364 double x1,x2,x3,y1,y2,y3,z1,z2,z3;364 IssmDouble x1,x2,x3,y1,y2,y3,z1,z2,z3; 365 365 366 366 x1=*(xyz_list+3*0+0); 367 367 y1=*(xyz_list+3*0+1); … … 379 379 } 380 380 /*}}}*/ 381 381 /*FUNCTION TriaRef::GetJacobianInvert{{{*/ 382 void TriaRef::GetJacobianInvert( double* Jinv, double* xyz_list,GaussTria* gauss){382 void TriaRef::GetJacobianInvert(IssmDouble* Jinv, IssmDouble* xyz_list,GaussTria* gauss){ 383 383 384 384 /*Jacobian*/ 385 double J[2][2];385 IssmDouble J[2][2]; 386 386 387 387 /*Call Jacobian routine to get the jacobian:*/ 388 388 GetJacobian(&J[0][0], xyz_list, gauss); … … 393 393 } 394 394 /*}}}*/ 395 395 /*FUNCTION TriaRef::GetNodalFunctions{{{*/ 396 void TriaRef::GetNodalFunctions( double* basis,GaussTria* gauss){396 void TriaRef::GetNodalFunctions(IssmDouble* basis,GaussTria* gauss){ 397 397 /*This routine returns the values of the nodal functions at the gaussian point.*/ 398 398 399 399 basis[0]=gauss->coord1; … … 403 403 } 404 404 /*}}}*/ 405 405 /*FUNCTION TriaRef::GetSegmentNodalFunctions{{{*/ 406 void TriaRef::GetSegmentNodalFunctions( double* basis,GaussTria* gauss,int index1,int index2){406 void TriaRef::GetSegmentNodalFunctions(IssmDouble* basis,GaussTria* gauss,int index1,int index2){ 407 407 /*This routine returns the values of the nodal functions at the gaussian point.*/ 408 408 409 double BasisFunctions[3];409 IssmDouble BasisFunctions[3]; 410 410 411 411 GetNodalFunctions(&BasisFunctions[0],gauss); 412 412 … … 417 417 } 418 418 /*}}}*/ 419 419 /*FUNCTION TriaRef::GetNodalFunctionsDerivatives{{{*/ 420 void TriaRef::GetNodalFunctionsDerivatives( double* dbasis,double* xyz_list, GaussTria* gauss){420 void TriaRef::GetNodalFunctionsDerivatives(IssmDouble* dbasis,IssmDouble* xyz_list, GaussTria* gauss){ 421 421 422 422 /*This routine returns the values of the nodal functions derivatives (with respect to the 423 423 * actual coordinate system): */ 424 424 int i; 425 double dbasis_ref[NDOF2][NUMNODES];426 double Jinv[NDOF2][NDOF2];425 IssmDouble dbasis_ref[NDOF2][NUMNODES]; 426 IssmDouble Jinv[NDOF2][NDOF2]; 427 427 428 428 /*Get derivative values with respect to parametric coordinate system: */ 429 429 GetNodalFunctionsDerivativesReference(&dbasis_ref[0][0], gauss); … … 444 444 } 445 445 /*}}}*/ 446 446 /*FUNCTION TriaRef::GetNodalFunctionsDerivativesReference{{{*/ 447 void TriaRef::GetNodalFunctionsDerivativesReference( double* dl1dl3,GaussTria* gauss){447 void TriaRef::GetNodalFunctionsDerivativesReference(IssmDouble* dl1dl3,GaussTria* gauss){ 448 448 /*This routine returns the values of the nodal functions derivatives (with respect to the 449 449 * natural coordinate system) at the gaussian point. */ 450 450 … … 463 463 } 464 464 /*}}}*/ 465 465 /*FUNCTION TriaRef::GetInputDerivativeValue{{{*/ 466 void TriaRef::GetInputDerivativeValue( double* p, double* plist,double* xyz_list, GaussTria* gauss){466 void TriaRef::GetInputDerivativeValue(IssmDouble* p, IssmDouble* plist,IssmDouble* xyz_list, GaussTria* gauss){ 467 467 468 468 /*From node values of parameter p (plist[0],plist[1],plist[2]), return parameter derivative value at gaussian 469 469 * point specified by gauss_basis: … … 474 474 */ 475 475 476 476 /*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. 478 478 479 479 /*Get dh1dh2dh3 in actual coordinate system: */ 480 480 GetNodalFunctionsDerivatives(&dbasis[0][0],xyz_list, gauss); … … 486 486 } 487 487 /*}}}*/ 488 488 /*FUNCTION TriaRef::GetInputValue{{{*/ 489 void TriaRef::GetInputValue( double* p, double* plist, GaussTria* gauss){489 void TriaRef::GetInputValue(IssmDouble* p, IssmDouble* plist, GaussTria* gauss){ 490 490 491 491 /*From node values of parameter p (plist[0],plist[1],plist[2]), return parameter value at gaussian 492 492 * point specifie by gauss: */ 493 493 494 494 /*nodal functions annd output: */ 495 double basis[3];495 IssmDouble basis[3]; 496 496 497 497 /*Get nodal functions*/ 498 498 GetNodalFunctions(basis, gauss);
Note:
See TracBrowser
for help on using the repository browser.