[17802] | 1 | Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 17393)
|
---|
| 4 | +++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 17394)
|
---|
| 5 | @@ -6,7 +6,7 @@
|
---|
| 6 | #include "../solutionsequences/solutionsequences.h"
|
---|
| 7 | #include "../cores/cores.h"
|
---|
| 8 |
|
---|
| 9 | -//#define FSANALYTICAL 101
|
---|
| 10 | +//#define FSANALYTICAL 4
|
---|
| 11 |
|
---|
| 12 | /*Model processing*/
|
---|
| 13 | int StressbalanceAnalysis::DofsPerNode(int** pdoftype,int meshtype,int approximation){/*{{{*/
|
---|
| 14 | Index: ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
|
---|
| 15 | ===================================================================
|
---|
| 16 | --- ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h (revision 17393)
|
---|
| 17 | +++ ../trunk-jpl/src/c/shared/Enum/EnumDefinitions.h (revision 17394)
|
---|
| 18 | @@ -532,6 +532,7 @@
|
---|
| 19 | StressTensoryyEnum,
|
---|
| 20 | StressTensoryzEnum,
|
---|
| 21 | StressTensorzzEnum,
|
---|
| 22 | + DivergenceEnum,
|
---|
| 23 | GiaCrossSectionShapeEnum,
|
---|
| 24 | GiadWdtEnum,
|
---|
| 25 | GiaWEnum,
|
---|
| 26 | Index: ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
|
---|
| 27 | ===================================================================
|
---|
| 28 | --- ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp (revision 17393)
|
---|
| 29 | +++ ../trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp (revision 17394)
|
---|
| 30 | @@ -521,6 +521,7 @@
|
---|
| 31 | case StressTensoryyEnum : return "StressTensoryy";
|
---|
| 32 | case StressTensoryzEnum : return "StressTensoryz";
|
---|
| 33 | case StressTensorzzEnum : return "StressTensorzz";
|
---|
| 34 | + case DivergenceEnum : return "Divergence";
|
---|
| 35 | case GiaCrossSectionShapeEnum : return "GiaCrossSectionShape";
|
---|
| 36 | case GiadWdtEnum : return "GiadWdt";
|
---|
| 37 | case GiaWEnum : return "GiaW";
|
---|
| 38 | Index: ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
|
---|
| 39 | ===================================================================
|
---|
| 40 | --- ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp (revision 17393)
|
---|
| 41 | +++ ../trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp (revision 17394)
|
---|
| 42 | @@ -533,6 +533,7 @@
|
---|
| 43 | else if (strcmp(name,"StressTensoryy")==0) return StressTensoryyEnum;
|
---|
| 44 | else if (strcmp(name,"StressTensoryz")==0) return StressTensoryzEnum;
|
---|
| 45 | else if (strcmp(name,"StressTensorzz")==0) return StressTensorzzEnum;
|
---|
| 46 | + else if (strcmp(name,"Divergence")==0) return DivergenceEnum;
|
---|
| 47 | else if (strcmp(name,"GiaCrossSectionShape")==0) return GiaCrossSectionShapeEnum;
|
---|
| 48 | else if (strcmp(name,"GiadWdt")==0) return GiadWdtEnum;
|
---|
| 49 | else if (strcmp(name,"GiaW")==0) return GiaWEnum;
|
---|
| 50 | @@ -627,11 +628,11 @@
|
---|
| 51 | else if (strcmp(name,"QmuInName")==0) return QmuInNameEnum;
|
---|
| 52 | else if (strcmp(name,"QmuOutName")==0) return QmuOutNameEnum;
|
---|
| 53 | else if (strcmp(name,"Regular")==0) return RegularEnum;
|
---|
| 54 | - else if (strcmp(name,"Scaled")==0) return ScaledEnum;
|
---|
| 55 | else stage=6;
|
---|
| 56 | }
|
---|
| 57 | if(stage==6){
|
---|
| 58 | - if (strcmp(name,"Separate")==0) return SeparateEnum;
|
---|
| 59 | + if (strcmp(name,"Scaled")==0) return ScaledEnum;
|
---|
| 60 | + else if (strcmp(name,"Separate")==0) return SeparateEnum;
|
---|
| 61 | else if (strcmp(name,"Sset")==0) return SsetEnum;
|
---|
| 62 | else if (strcmp(name,"Verbose")==0) return VerboseEnum;
|
---|
| 63 | else if (strcmp(name,"TriangleInterp")==0) return TriangleInterpEnum;
|
---|
| 64 | Index: ../trunk-jpl/src/c/classes/FemModel.cpp
|
---|
| 65 | ===================================================================
|
---|
| 66 | --- ../trunk-jpl/src/c/classes/FemModel.cpp (revision 17393)
|
---|
| 67 | +++ ../trunk-jpl/src/c/classes/FemModel.cpp (revision 17394)
|
---|
| 68 | @@ -431,6 +431,7 @@
|
---|
| 69 |
|
---|
| 70 | switch (response_descriptor_enum){
|
---|
| 71 |
|
---|
| 72 | + case DivergenceEnum: this->Divergencex(responses); break;
|
---|
| 73 | case IceVolumeEnum: this->IceVolumex(responses); break;
|
---|
| 74 | case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(responses); break;
|
---|
| 75 | case MinVelEnum: this->MinVelx(responses); break;
|
---|
| 76 | @@ -503,6 +504,7 @@
|
---|
| 77 | switch(output_enum){
|
---|
| 78 |
|
---|
| 79 | /*Scalar output*/
|
---|
| 80 | + case DivergenceEnum: this->Divergencex(&double_result); break;
|
---|
| 81 | case IceVolumeEnum: this->IceVolumex(&double_result); break;
|
---|
| 82 | case IceVolumeAboveFloatationEnum: this->IceVolumeAboveFloatationx(&double_result); break;
|
---|
| 83 | case MinVelEnum: this->MinVelx(&double_result); break;
|
---|
| 84 | @@ -1041,6 +1043,22 @@
|
---|
| 85 | *pSmb=total_smb;
|
---|
| 86 |
|
---|
| 87 | }/*}}}*/
|
---|
| 88 | +void FemModel::Divergencex(IssmDouble* pdiv){/*{{{*/
|
---|
| 89 | +
|
---|
| 90 | + IssmDouble local_divergence=0;
|
---|
| 91 | + IssmDouble total_divergence;
|
---|
| 92 | +
|
---|
| 93 | + for(int i=0;i<this->elements->Size();i++){
|
---|
| 94 | + Element* element=dynamic_cast<Element*>(this->elements->GetObjectByOffset(i));
|
---|
| 95 | + local_divergence+=element->Divergence();
|
---|
| 96 | + }
|
---|
| 97 | + ISSM_MPI_Reduce(&local_divergence,&total_divergence,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,0,IssmComm::GetComm() );
|
---|
| 98 | + ISSM_MPI_Bcast(&total_divergence,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
|
---|
| 99 | +
|
---|
| 100 | + /*Assign output pointers: */
|
---|
| 101 | + *pdiv=total_divergence;
|
---|
| 102 | +
|
---|
| 103 | +}/*}}}*/
|
---|
| 104 | void FemModel::IceVolumex(IssmDouble* pV){/*{{{*/
|
---|
| 105 |
|
---|
| 106 | IssmDouble local_ice_volume = 0;
|
---|
| 107 | Index: ../trunk-jpl/src/c/classes/Elements/Element.h
|
---|
| 108 | ===================================================================
|
---|
| 109 | --- ../trunk-jpl/src/c/classes/Elements/Element.h (revision 17393)
|
---|
| 110 | +++ ../trunk-jpl/src/c/classes/Elements/Element.h (revision 17394)
|
---|
| 111 | @@ -55,6 +55,7 @@
|
---|
| 112 | /* bool AnyActive(void); */
|
---|
| 113 | void CoordinateSystemTransform(IssmDouble** ptransform,Node** nodes,int numnodes,int* cs_array);
|
---|
| 114 | void DeleteMaterials(void);
|
---|
| 115 | + IssmDouble Divergence(void);
|
---|
| 116 | void FindParam(bool* pvalue,int paramenum);
|
---|
| 117 | void FindParam(int* pvalue,int paramenum);
|
---|
| 118 | void FindParam(IssmDouble* pvalue,int paramenum);
|
---|
| 119 | Index: ../trunk-jpl/src/c/classes/Elements/Element.cpp
|
---|
| 120 | ===================================================================
|
---|
| 121 | --- ../trunk-jpl/src/c/classes/Elements/Element.cpp (revision 17393)
|
---|
| 122 | +++ ../trunk-jpl/src/c/classes/Elements/Element.cpp (revision 17394)
|
---|
| 123 | @@ -129,6 +129,38 @@
|
---|
| 124 | void Element::DeleteMaterials(void){/*{{{*/
|
---|
| 125 | delete this->material;
|
---|
| 126 | }/*}}}*/
|
---|
| 127 | +IssmDouble Element::Divergence(void){/*{{{*/
|
---|
| 128 | + /*Compute element divergence*/
|
---|
| 129 | +
|
---|
| 130 | + /*Intermediaries*/
|
---|
| 131 | + IssmDouble Jdet;
|
---|
| 132 | + IssmDouble divergence=0.;
|
---|
| 133 | + IssmDouble dvx[3],dvy[3],dvz[3];
|
---|
| 134 | + IssmDouble *xyz_list = NULL;
|
---|
| 135 | +
|
---|
| 136 | + /*Get inputs and parameters*/
|
---|
| 137 | + Input* vx_input = this->GetInput(VxEnum); _assert_(vx_input);
|
---|
| 138 | + Input* vy_input = this->GetInput(VyEnum); _assert_(vy_input);
|
---|
| 139 | + Input* vz_input = this->GetInput(VzEnum); _assert_(vz_input);
|
---|
| 140 | + this->GetVerticesCoordinates(&xyz_list);
|
---|
| 141 | +
|
---|
| 142 | + Gauss* gauss=this->NewGaussBase(5);
|
---|
| 143 | + for(int ig=gauss->begin();ig<gauss->end();ig++){
|
---|
| 144 | + gauss->GaussPoint(ig);
|
---|
| 145 | + this->JacobianDeterminant(&Jdet,xyz_list,gauss);
|
---|
| 146 | +
|
---|
| 147 | + /*Get strain rate assuming that epsilon has been allocated*/
|
---|
| 148 | + vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
|
---|
| 149 | + vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
|
---|
| 150 | + vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
|
---|
| 151 | +
|
---|
| 152 | + divergence += (dvx[0]+dvy[1]+dvz[2])*gauss->weight*Jdet;
|
---|
| 153 | + }
|
---|
| 154 | +
|
---|
| 155 | + /*Clean up and return*/
|
---|
| 156 | + delete gauss;
|
---|
| 157 | + return divergence;
|
---|
| 158 | +}/*}}}*/
|
---|
| 159 | void Element::FindParam(bool* pvalue,int paramenum){/*{{{*/
|
---|
| 160 | this->parameters->FindParam(pvalue,paramenum);
|
---|
| 161 | }/*}}}*/
|
---|
| 162 | Index: ../trunk-jpl/src/c/classes/FemModel.h
|
---|
| 163 | ===================================================================
|
---|
| 164 | --- ../trunk-jpl/src/c/classes/FemModel.h (revision 17393)
|
---|
| 165 | +++ ../trunk-jpl/src/c/classes/FemModel.h (revision 17394)
|
---|
| 166 | @@ -71,6 +71,7 @@
|
---|
| 167 | void MinVyx(IssmDouble* presponse);
|
---|
| 168 | void MinVzx(IssmDouble* presponse);
|
---|
| 169 | void TotalSmbx(IssmDouble* pSmb);
|
---|
| 170 | + void Divergencex(IssmDouble* pdiv);
|
---|
| 171 | void IceVolumex(IssmDouble* pV);
|
---|
| 172 | void IceVolumeAboveFloatationx(IssmDouble* pV);
|
---|
| 173 | void ElementResponsex(IssmDouble* presponse,int response_enum);
|
---|