 |
Ice Sheet System Model
4.18
Code documentation
|
#include <ThermalAnalysis.h>
|
void | CreateConstraints (Constraints *constraints, IoModel *iomodel) |
|
void | CreateLoads (Loads *loads, IoModel *iomodel) |
|
void | CreateNodes (Nodes *nodes, IoModel *iomodel, bool isamr=false) |
|
int | DofsPerNode (int **doflist, int domaintype, int approximation) |
|
void | UpdateElements (Elements *elements, Inputs2 *inputs2, IoModel *iomodel, int analysis_counter, int analysis_type) |
|
void | UpdateParameters (Parameters *parameters, IoModel *iomodel, int solution_enum, int analysis_enum) |
|
void | Core (FemModel *femmodel) |
|
ElementVector * | CreateDVector (Element *element) |
|
ElementMatrix * | CreateJacobianMatrix (Element *element) |
|
ElementMatrix * | CreateKMatrix (Element *element) |
|
ElementMatrix * | CreateKMatrixShelf (Element *element) |
|
ElementMatrix * | CreateKMatrixVolume (Element *element) |
|
ElementVector * | CreatePVector (Element *element) |
|
ElementVector * | CreatePVectorSheet (Element *element) |
|
ElementVector * | CreatePVectorShelf (Element *element) |
|
ElementVector * | CreatePVectorVolume (Element *element) |
|
void | GetBAdvec (IssmDouble *B, Element *element, IssmDouble *xyz_list, Gauss *gauss) |
|
void | GetBAdvecprime (IssmDouble *B, Element *element, IssmDouble *xyz_list, Gauss *gauss) |
|
void | GetBConduct (IssmDouble *B, Element *element, IssmDouble *xyz_list, Gauss *gauss) |
|
void | GetSolutionFromInputs (Vector< IssmDouble > *solution, Element *element) |
|
void | GradientJ (Vector< IssmDouble > *gradient, Element *element, int control_type, int control_index) |
|
void | InputUpdateFromSolution (IssmDouble *solution, Element *element) |
|
void | UpdateConstraints (FemModel *femmodel) |
|
virtual | ~Analysis () |
|
Definition at line 11 of file ThermalAnalysis.h.
◆ CreateConstraints()
Implements Analysis.
Definition at line 8 of file ThermalAnalysis.cpp.
25 bool isdynamic =
false;
45 iomodel->
FetchData(&spcvector,&M,&N,
"md.thermal.spctemperature");
46 iomodel->
FetchData(&spcvectorstatic,&M,&N,
"md.thermal.spctemperature");
53 if (issurface[i]==1)spcvectorstatic[i*N+j] = NAN;
54 else spcvector[i*N+j] = NAN;
68 iomodel->
DeleteData(spcvector,
"md.thermal.spctemperature");
69 iomodel->
DeleteData(spcvectorstatic,
"md.thermal.spctemperature");
70 iomodel->
DeleteData(issurface,
"md.mesh.vertexonsurface");
◆ CreateLoads()
void ThermalAnalysis::CreateLoads |
( |
Loads * |
loads, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateNodes()
void ThermalAnalysis::CreateNodes |
( |
Nodes * |
nodes, |
|
|
IoModel * |
iomodel, |
|
|
bool |
isamr = false |
|
) |
| |
|
virtual |
◆ DofsPerNode()
int ThermalAnalysis::DofsPerNode |
( |
int ** |
doflist, |
|
|
int |
domaintype, |
|
|
int |
approximation |
|
) |
| |
|
virtual |
◆ UpdateElements()
void ThermalAnalysis::UpdateElements |
( |
Elements * |
elements, |
|
|
Inputs2 * |
inputs2, |
|
|
IoModel * |
iomodel, |
|
|
int |
analysis_counter, |
|
|
int |
analysis_type |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 106 of file ThermalAnalysis.cpp.
108 int frictionlaw,basalforcing_model,materialstype;
109 int FrictionCoupling;
121 element->
Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
126 bool dakota_analysis, ismovingfront;
127 iomodel->
FindConstant(&dakota_analysis,
"md.qmu.isdakota");
128 iomodel->
FindConstant(&ismovingfront,
"md.transient.ismovingfront");
130 iomodel->
FindConstant(&materialstype,
"md.materials.type");
155 switch(materialstype){
177 iomodel->
FindConstant(&basalforcing_model,
"md.basalforcings.model");
178 switch(basalforcing_model){
188 iomodel->
FindConstant(&FrictionCoupling,
"md.friction.coupling");
192 if (FrictionCoupling==3){
194 else if(FrictionCoupling==4){
203 iomodel->
FindConstant(&FrictionCoupling,
"md.friction.coupling");
207 if (FrictionCoupling==3){
209 else if(FrictionCoupling==4){
219 iomodel->
FindConstant(&FrictionCoupling,
"md.friction.coupling");
234 iomodel->
FindConstant(&FrictionCoupling,
"md.friction.coupling");
239 if (FrictionCoupling==3){
241 else if(FrictionCoupling==4){
252 _error_(
"friction law not supported");
◆ UpdateParameters()
void ThermalAnalysis::UpdateParameters |
( |
Parameters * |
parameters, |
|
|
IoModel * |
iomodel, |
|
|
int |
solution_enum, |
|
|
int |
analysis_enum |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 255 of file ThermalAnalysis.cpp.
258 char** requestedoutputs = NULL;
269 iomodel->
FindConstant(&requestedoutputs,&numoutputs,
"md.thermal.requested_outputs");
272 iomodel->
DeleteData(&requestedoutputs,numoutputs,
"md.thermal.requested_outputs");
285 if(frictionlaw==1 || frictionlaw==3 || frictionlaw==7){
◆ Core()
void ThermalAnalysis::Core |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
◆ CreateDVector()
◆ CreateJacobianMatrix()
◆ CreateKMatrix()
◆ CreateKMatrixShelf()
Definition at line 323 of file ThermalAnalysis.cpp.
342 IssmDouble* basis = xNew<IssmDouble>(numnodes);
356 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
362 D=gauss->
weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel/(heatcapacity*rho_ice);
363 if(reCast<bool,IssmDouble>(dt)) D=dt*D;
373 xDelete<IssmDouble>(basis);
374 xDelete<IssmDouble>(xyz_list_base);
◆ CreateKMatrixVolume()
Definition at line 377 of file ThermalAnalysis.cpp.
387 IssmDouble tau_parameter_anisotropic[2],tau_parameter_hor,tau_parameter_ver;
395 IssmDouble* basis = xNew<IssmDouble>(numnodes);
396 IssmDouble* dbasis = xNew<IssmDouble>(3*numnodes);
397 IssmDouble* Bprime = xNew<IssmDouble>(3*numnodes);
409 IssmDouble kappa = thermalconductivity/(rho_ice*heatcapacity);
419 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
426 D_scalar=gauss->
weight*Jdet;
427 if(dt!=0.) D_scalar=D_scalar*dt;
430 for(
int i=0;i<numnodes;i++){
431 for(
int j=0;j<numnodes;j++){
432 Ke->
values[i*numnodes+j] += D_scalar*kappa*(
433 dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[2*numnodes+j]*dbasis[2*numnodes+i]
442 for(
int i=0;i<numnodes;i++){
443 for(
int j=0;j<numnodes;j++){
444 Ke->
values[i*numnodes+j] += D_scalar*(
445 vx*dbasis[0*numnodes+j]*basis[i] + vy*dbasis[1*numnodes+j]*basis[i] +vz*dbasis[2*numnodes+j]*basis[i]
452 D_scalar=gauss->
weight*Jdet;
453 for(
int i=0;i<numnodes;i++){
454 for(
int j=0;j<numnodes;j++){
455 Ke->
values[i*numnodes+j] += D_scalar*basis[j]*basis[i];
458 D_scalar=D_scalar*dt;
462 if(stabilization==1){
464 vel=sqrt(vx*vx + vy*vy + vz*vz)+1.e-14;
465 h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) + pow(hz*vz/vel,2));
466 K[0][0]=h/(2.*vel)*fabs(vx*vx); K[0][1]=h/(2.*vel)*fabs(vx*vy); K[0][2]=h/(2.*vel)*fabs(vx*vz);
467 K[1][0]=h/(2.*vel)*fabs(vy*vx); K[1][1]=h/(2.*vel)*fabs(vy*vy); K[1][2]=h/(2.*vel)*fabs(vy*vz);
468 K[2][0]=h/(2.*vel)*fabs(vz*vx); K[2][1]=h/(2.*vel)*fabs(vz*vy); K[2][2]=h/(2.*vel)*fabs(vz*vz);
469 for(
int i=0;i<3;i++)
for(
int j=0;j<3;j++) K[i][j] = D_scalar*K[i][j];
477 else if(stabilization==2){
480 for(
int i=0;i<numnodes;i++){
481 for(
int j=0;j<numnodes;j++){
482 Ke->
values[i*numnodes+j]+=tau_parameter*D_scalar*
483 ((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i])*
484 ((u-um)*dbasis[0*numnodes+j]+(v-vm)*dbasis[1*numnodes+j]+(w-wm)*dbasis[2*numnodes+j]);
488 D_scalar=gauss->
weight*Jdet;
489 for(
int i=0;i<numnodes;i++){
490 for(
int j=0;j<numnodes;j++){
491 Ke->
values[i*numnodes+j]+=tau_parameter*D_scalar*basis[j]*((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i]);
497 else if(stabilization==3){
501 tau_parameter_hor=tau_parameter_anisotropic[0];
502 tau_parameter_ver=tau_parameter_anisotropic[1];
503 for(
int i=0;i<numnodes;i++){
504 for(
int j=0;j<numnodes;j++){
505 Ke->
values[i*numnodes+j]+=D_scalar*
506 (sqrt(tau_parameter_hor)*(u-um)*dbasis[0*numnodes+i]+sqrt(tau_parameter_hor)*(v-vm)*dbasis[1*numnodes+i]+sqrt(tau_parameter_ver)*(w-wm)*dbasis[2*numnodes+i])*
507 (sqrt(tau_parameter_hor)*(u-um)*dbasis[0*numnodes+j]+sqrt(tau_parameter_hor)*(v-vm)*dbasis[1*numnodes+j]+sqrt(tau_parameter_ver)*(w-wm)*dbasis[2*numnodes+j]);
514 xDelete<IssmDouble>(xyz_list);
515 xDelete<IssmDouble>(Bprime);
516 xDelete<IssmDouble>(basis);
517 xDelete<IssmDouble>(dbasis);
◆ CreatePVector()
◆ CreatePVectorSheet()
Definition at line 538 of file ThermalAnalysis.cpp.
547 IssmDouble alpha2,scalar,basalfriction,heatflux;
555 IssmDouble* basis = xNew<IssmDouble>(numnodes);
572 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
584 basalfriction = alpha2*(vx*vx + vy*vy + vz*vz);
585 heatflux = (basalfriction+geothermalflux)/(rho_ice*heatcapacity);
587 scalar = gauss->
weight*Jdet*heatflux;
588 if(dt!=0.) scalar=dt*scalar;
590 for(
int i=0;i<numnodes;i++) pe->
values[i]+=scalar*basis[i];
596 xDelete<IssmDouble>(basis);
597 xDelete<IssmDouble>(xyz_list_base);
◆ CreatePVectorShelf()
Definition at line 600 of file ThermalAnalysis.cpp.
605 IssmDouble t_pmp,dt,Jdet,scalar_ocean,pressure;
616 IssmDouble* basis = xNew<IssmDouble>(numnodes);
631 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
640 scalar_ocean=gauss->
weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel*(t_pmp)/(heatcapacity*rho_ice);
641 if(reCast<bool,IssmDouble>(dt)) scalar_ocean=dt*scalar_ocean;
643 for(
int i=0;i<numnodes;i++) pe->
values[i]+=scalar_ocean*basis[i];
648 xDelete<IssmDouble>(basis);
649 xDelete<IssmDouble>(xyz_list_base);
◆ CreatePVectorVolume()
Definition at line 652 of file ThermalAnalysis.cpp.
662 IssmDouble tau_parameter_anisotropic[2],tau_parameter_hor,tau_parameter_ver;
672 IssmDouble* basis = xNew<IssmDouble>(numnodes);
673 IssmDouble* dbasis = xNew<IssmDouble>(3*numnodes);
680 IssmDouble kappa = thermalconductivity/(rho_ice*heatcapacity);
686 Input2* temperature_input = NULL;
691 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
696 element->
ViscousHeating(&phi,xyz_list,gauss,vx_input,vy_input,vz_input);
698 scalar_def=phi/(rho_ice*heatcapacity)*Jdet*gauss->
weight;
699 if(reCast<bool,IssmDouble>(dt)) scalar_def=scalar_def*dt;
701 for(
int i=0;i<numnodes;i++) pe->
values[i]+=scalar_def*basis[i];
704 if(reCast<bool,IssmDouble>(dt)){
706 scalar_transient=temperature*Jdet*gauss->
weight;
707 for(
int i=0;i<numnodes;i++) pe->
values[i]+=scalar_transient*basis[i];
710 if(stabilization==2){
719 for(
int i=0;i<numnodes;i++) pe->
values[i]+=tau_parameter*scalar_def*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]);
720 if(reCast<bool,IssmDouble>(dt)){
721 for(
int i=0;i<numnodes;i++) pe->
values[i]+=tau_parameter*scalar_transient*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]);
725 else if(stabilization==3){
732 tau_parameter_hor=tau_parameter_anisotropic[0];
733 tau_parameter_ver=tau_parameter_anisotropic[1];
735 for(
int i=0;i<numnodes;i++) pe->
values[i]+=scalar_def*(tau_parameter_hor*u*dbasis[0*numnodes+i]+tau_parameter_hor*v*dbasis[1*numnodes+i]+tau_parameter_ver*w*dbasis[2*numnodes+i]);
740 xDelete<IssmDouble>(basis);
741 xDelete<IssmDouble>(dbasis);
742 xDelete<IssmDouble>(xyz_list);
◆ GetBAdvec()
Definition at line 747 of file ThermalAnalysis.cpp.
767 for(
int i=0;i<numnodes;i++){
768 B[numnodes*0+i] = basis[i];
769 B[numnodes*1+i] = basis[i];
770 B[numnodes*2+i] = basis[i];
774 xDelete<IssmDouble>(basis);
◆ GetBAdvecprime()
Definition at line 776 of file ThermalAnalysis.cpp.
792 IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
796 for(
int i=0;i<numnodes;i++){
797 B[numnodes*0+i] = dbasis[0*numnodes+i];
798 B[numnodes*1+i] = dbasis[1*numnodes+i];
799 B[numnodes*2+i] = dbasis[2*numnodes+i];
803 xDelete<IssmDouble>(dbasis);
◆ GetBConduct()
Definition at line 805 of file ThermalAnalysis.cpp.
821 IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
825 for(
int i=0;i<numnodes;i++){
826 B[numnodes*0+i] = dbasis[0*numnodes+i];
827 B[numnodes*1+i] = dbasis[1*numnodes+i];
828 B[numnodes*2+i] = dbasis[2*numnodes+i];
832 xDelete<IssmDouble>(dbasis);
◆ GetSolutionFromInputs()
◆ GradientJ()
void ThermalAnalysis::GradientJ |
( |
Vector< IssmDouble > * |
gradient, |
|
|
Element * |
element, |
|
|
int |
control_type, |
|
|
int |
control_index |
|
) |
| |
|
virtual |
◆ InputUpdateFromSolution()
void ThermalAnalysis::InputUpdateFromSolution |
( |
IssmDouble * |
solution, |
|
|
Element * |
element |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 840 of file ThermalAnalysis.cpp.
853 IssmDouble* values = xNew<IssmDouble>(numnodes);
854 IssmDouble* surface = xNew<IssmDouble>(numnodes);
858 for(i=0;i<numnodes;i++){
859 values[i]=solution[doflist[i]];
862 if(xIsNan<IssmDouble>(values[i]))
_error_(
"NaN found in solution vector");
863 if(xIsInf<IssmDouble>(values[i]))
_error_(
"Inf found in solution vector");
870 IssmDouble* pressure = xNew<IssmDouble>(numnodes);
872 for(i=0;i<numnodes;i++){
876 xDelete<IssmDouble>(pressure);
886 for(i=0;i<numnodes;i++) n[i]=3.;
897 switch(rheology_law){
902 for(i=0;i<numnodes;i++) B[i]=
BuddJacka(values[i]);
906 for(i=0;i<numnodes;i++) B[i]=
Cuffey(values[i]);
910 for(i=0;i<numnodes;i++) B[i]=
Paterson(values[i]);
914 for(i=0;i<numnodes;i++) B[i]=
NyeH2O(values[i]);
918 for(i=0;i<numnodes;i++) B[i]=
NyeCO2(values[i]);
923 for(i=0;i<numnodes;i++) B[i]=
Arrhenius(values[i],surface[i]-xyz_list[i*3+2],n[i]);
930 xDelete<IssmDouble>(n);
937 xDelete<IssmDouble>(values);
938 xDelete<IssmDouble>(surface);
939 xDelete<IssmDouble>(B);
940 xDelete<IssmDouble>(xyz_list);
941 xDelete<int>(doflist);
◆ UpdateConstraints()
void ThermalAnalysis::UpdateConstraints |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
The documentation for this class was generated from the following files:
@ MaterialsThermalconductivityEnum
@ FrictionCoefficientEnum
@ ThermalPenaltyFactorEnum
virtual int GetElementType(void)=0
IssmDouble Cuffey(IssmDouble temperature)
IssmDouble Paterson(IssmDouble temperature)
void GetInputListOnNodes(IssmDouble *pvalue, int enumtype)
ElementMatrix * CreateKMatrixVolume(Element *element)
@ ThermalStabilizationEnum
virtual int GetNumberOfNodes(void)=0
@ ThermalRequestedOutputsEnum
@ FrictionEffectivePressureEnum
void FindParam(bool *pvalue, int paramenum)
void GetBAdvecprime(IssmDouble *B, Element *element, IssmDouble *xyz_list, Gauss *gauss)
virtual Gauss * NewGaussBase(int order)=0
int AddObject(Object *object)
@ MaterialsRheologyEcEnum
@ TimesteppingTimeStepEnum
@ ThermalNumRequestedOutputsEnum
@ ThermalIsdynamicbasalspcEnum
int TripleMultiply(IssmDouble *a, int nrowa, int ncola, int itrna, IssmDouble *b, int nrowb, int ncolb, int itrnb, IssmDouble *c, int nrowc, int ncolc, int itrnc, IssmDouble *d, int iaddd)
@ ThermalPenaltyThresholdEnum
virtual void JacobianDeterminantBase(IssmDouble *Jdet, IssmDouble *xyz_list_base, Gauss *gauss)=0
ElementMatrix * CreateKMatrixShelf(Element *element)
void AddObject(Param *newparam)
ElementVector * CreatePVectorShelf(Element *element)
ElementVector * CreatePVectorVolume(Element *element)
void IoModelToDynamicConstraintsx(Constraints *constraints, IoModel *iomodel, const char *spc_name, int analysis_type, int finite_element, int dof)
virtual Input2 * GetInput2(int inputenum)=0
virtual void NodalFunctions(IssmDouble *basis, Gauss *gauss)=0
IssmDouble NyeCO2(IssmDouble temperature)
virtual void ElementSizes(IssmDouble *phx, IssmDouble *phy, IssmDouble *phz)=0
ElementVector * NewElementVector(int approximation_enum=NoneApproximationEnum)
void DeleteData(int num,...)
Param * CopyConstantObject(const char *constant_name, int param_enum)
IssmDouble BuddJacka(IssmDouble temperature)
void CreateNodes(Nodes *nodes, IoModel *iomodel, bool isamr=false)
virtual void AddInput2(int input_enum, IssmDouble *values, int interpolation_enum)
virtual Gauss * NewGauss(void)=0
@ FrictionPressureAdjustedTemperatureEnum
@ MaterialsThermalExchangeVelocityEnum
const char * EnumToStringx(int enum_in)
@ MantlePlumeGeothermalFluxEnum
void FindConstant(bool *pvalue, const char *constant_name)
IssmDouble NyeH2O(IssmDouble temperature)
virtual void StabilizationParameterAnisotropic(IssmDouble *tau_parameter_anisotropic, IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble hx, IssmDouble hy, IssmDouble hz, IssmDouble kappa)=0
void GetVerticesCoordinates(IssmDouble **xyz_list)
@ MaterialsHeatcapacityEnum
@ MaterialsRheologyLawEnum
void FetchData(bool *pboolean, const char *data_name)
@ MaterialsRheologyEsEnum
@ MaterialsRhoSeawaterEnum
void CreateSingleNodeToElementConnectivity(IoModel *iomodel)
virtual int ObjectEnum()=0
void GetDofListLocal(int **pdoflist, int approximation_enum, int setenum)
IssmDouble TMeltingPoint(IssmDouble pressure)
virtual IssmDouble StabilizationParameter(IssmDouble u, IssmDouble v, IssmDouble w, IssmDouble diameter, IssmDouble kappa)=0
IssmDouble * Data(const char *data_name)
ElementVector * CreatePVectorSheet(Element *element)
void GetSolutionFromInputsOneDof(Vector< IssmDouble > *solution, int solutionenum)
virtual void GetVerticesCoordinatesBase(IssmDouble **xyz_list)=0
#define _error_(StreamArgs)
void SetActiveNodesLSMx(FemModel *femmodel)
virtual int begin(void)=0
Object * GetObjectByOffset(int offset)
@ MeshVertexonsurfaceEnum
IssmDouble Arrhenius(IssmDouble temperature, IssmDouble depth, IssmDouble n)
virtual void JacobianDeterminant(IssmDouble *Jdet, IssmDouble *xyz_list, Gauss *gauss)=0
@ FrictionEffectivePressureLimitEnum
virtual void GaussPoint(int ig)=0
virtual void Update(Inputs2 *inputs2, int index, IoModel *iomodel, int analysis_counter, int analysis_type, int finite_element)=0
void GetInputValue(bool *pvalue, int enum_type)
void GetAlpha2(IssmDouble *palpha2, Gauss *gauss)
void FetchDataToInput(Inputs2 *inputs2, Elements *elements, const char *vector_name, int input_enum)
@ FrictionCoefficientcoulombEnum
void IoModelToConstraintsx(Constraints *constraints, IoModel *iomodel, const char *spc_name, int analysis_type, int finite_element, int dof)
@ SteadystateSolutionEnum
@ BasalforcingsGeothermalfluxEnum
virtual void ViscousHeating(IssmDouble *pphi, IssmDouble *xyz_list, Gauss *gauss, Input2 *vx_input, Input2 *vy_input, Input2 *vz_input)
virtual void NodalFunctionsDerivatives(IssmDouble *dbasis, IssmDouble *xyz_list, Gauss *gauss)=0
@ MaterialsMixedLayerCapacityEnum
virtual IssmDouble MinEdgeLength(IssmDouble *xyz_list)=0
ElementMatrix * NewElementMatrix(int approximation_enum=NoneApproximationEnum)