Changeset 24146


Ignore:
Timestamp:
09/16/19 00:19:47 (6 years ago)
Author:
nmokus
Message:

NEW: arctan-based damage evolution law

Location:
issm/trunk-jpl/src
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.cpp

    r24091 r24146  
    6060        iomodel->DeleteData(1,"md.flowequation.element_equation");
    6161
     62   /*First, reset all F to 0 */
     63        for(int i=0;i<elements->Size();i++){
     64                Element* element=xDynamicCast<Element*>(elements->GetObjectByOffset(i));
     65                int numvertices = element->GetNumberOfVertices();
     66                IssmDouble* values = xNewZeroInit<IssmDouble>(numvertices);
     67                element->AddInput(DamageFEnum,values,P1Enum);
     68                xDelete<IssmDouble>(values);
     69        }
     70
     71
    6272        /*What input do I need to run my damage evolution model?*/
    6373        iomodel->FetchDataToInput(elements,"md.initialization.vx",VxEnum);
     
    97107                parameters->AddObject(iomodel->CopyConstantObject("md.damage.c2",DamageC2Enum));
    98108                parameters->AddObject(iomodel->CopyConstantObject("md.damage.c3",DamageC3Enum));
     109                parameters->AddObject(iomodel->CopyConstantObject("md.damage.c4",DamageC4Enum));
    99110                parameters->AddObject(iomodel->CopyConstantObject("md.damage.stress_threshold",DamageStressThresholdEnum));
     111                parameters->AddObject(iomodel->CopyConstantObject("md.damage.stress_ubound",DamageStressUBoundEnum));
    100112                parameters->AddObject(iomodel->CopyConstantObject("md.damage.kappa",DamageKappaEnum));
    101113                parameters->AddObject(iomodel->CopyConstantObject("md.damage.healing",DamageHealingEnum));
     
    130142        xDelete<IssmDouble>(f);
    131143}/*}}}*/
     144void           DamageEvolutionAnalysis::CreateDamageFInputArctan(Element* element){/*{{{*/
     145        IssmDouble c1, c2, stress_threshold, stress_ubound;
     146        IssmDouble damage;
     147        IssmDouble yts;
     148        IssmDouble principalDevStress1, principalDevStress2;
     149        IssmDouble tensileStress, compressiveStress;
     150       
     151        int equivstress, domaintype, dim;
     152
     153        /*Fetch number of vertices and allocate output*/
     154        int numnodes = element->GetNumberOfNodes();
     155        IssmDouble* f   = xNew<IssmDouble>(numnodes);
     156
     157        /*retrieve parameters:*/
     158        element->FindParam(&c1,DamageC1Enum);
     159        element->FindParam(&c2,DamageC2Enum);
     160        element->FindParam(&yts,ConstantsYtsEnum);
     161        element->FindParam(&stress_threshold,DamageStressThresholdEnum);
     162        element->FindParam(&stress_ubound,DamageStressUBoundEnum);
     163        element->FindParam(&domaintype,DomainTypeEnum);
     164
     165        /*Get problem dimension*/
     166        switch(domaintype){
     167                case Domain2DhorizontalEnum: dim = 2; break;
     168                case Domain3DEnum:           dim = 3; break;
     169                default: _error_("not implemented");
     170        }
     171        /*Compute stress tensor and Stress Max Principal: */
     172        element->ComputeDeviatoricStressTensor();
     173
     174        Input* principalDevStress1_input = element->GetInput(DeviatoricStress1Enum);     _assert_(principalDevStress1_input);
     175        Input* principalDevStress2_input = element->GetInput(DeviatoricStress2Enum);     _assert_(principalDevStress2_input);
     176
     177        Input* damage_input = NULL;
     178        if(domaintype==Domain2DhorizontalEnum){
     179                damage_input = element->GetInput(DamageDbarEnum);       _assert_(damage_input);
     180        }
     181        else{
     182                damage_input = element->GetInput(DamageDEnum);   _assert_(damage_input);
     183        }
     184
     185        /*Calculate damage evolution source term */
     186        Gauss* gauss=element->NewGauss();
     187
     188        /* To keep arctan output (bounded by -pi/2 and pi/2) within the specified boundaries */
     189        c1 /= (PI/2);
     190        c2 /= (PI/2);
     191        /* To have per second output with per annum parameters */
     192        c1 /= yts;
     193        c2 /= yts;
     194
     195        for (int i=0;i<numnodes;i++){
     196                f[i] = 0;
     197               
     198                gauss->GaussNode(element->GetElementType(),i);
     199
     200                damage_input->GetInputValue(&damage,gauss);
     201                principalDevStress1_input->GetInputValue(&principalDevStress1,gauss);
     202                principalDevStress2_input->GetInputValue(&principalDevStress2,gauss);
     203
     204                tensileStress     = sqrt(1.5*(pow(max(principalDevStress1, 0.), 2) + pow(max(principalDevStress2, 0.), 2)));
     205                compressiveStress = sqrt(1.5*(pow(min(principalDevStress1, 0.), 2) + pow(min(principalDevStress2, 0.), 2)));
     206
     207                /* Calculate principal effective stresses */
     208                if(dim==2){
     209                        f[i] = 0;
     210                        if(tensileStress > stress_threshold)
     211                                f[i] += c1*atan((tensileStress/stress_threshold - 1)/(1-damage));
     212
     213                        if(compressiveStress < stress_ubound)
     214                                f[i] += c2*atan((compressiveStress/stress_ubound - 1)/(1-damage));
     215                }
     216                else{
     217                        _error_("Only 2D is implemented.");
     218                }
     219        }
     220
     221        /*Add input*/
     222        element->AddInput(DamageFEnum,f,element->GetElementType());
     223
     224        /*Clean up and return*/
     225        xDelete<IssmDouble>(f);
     226        delete gauss;
     227}/*}}}*/
     228
    132229void           DamageEvolutionAnalysis::CreateDamageFInputExp(Element* element){/*{{{*/
    133230
     
    191288                }
    192289                else f[i]=0;
     290
     291                /*Edits from MM*/
     292                if(f[i]>10.) f[i]=10.;
     293                if(f[i]<-10.) f[i]=-10.;
    193294        }
    194295
     
    358459        element->GetVerticesCoordinates(&xyz_list);
    359460        element->FindParam(&dt,TimesteppingTimeStepEnum);
     461        //printf("dt %f\n", dt);
    360462        element->FindParam(&stabilization,DamageStabilizationEnum);
    361463        Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input);
     
    525627                        this->CreateDamageFInputExp(element);
    526628                        break;
     629                case 3:
     630                        this->CreateDamageFInputArctan(element);
     631                        break;
    527632                default:
    528633                        _error_("not implemented yet");
  • issm/trunk-jpl/src/c/analyses/DamageEvolutionAnalysis.h

    r23585 r24146  
    2323                void           Core(FemModel* femmodel);
    2424                void           CreateDamageFInput(Element* element);
     25                void           CreateDamageFInputArctan(Element* element);
    2526                void           CreateDamageFInputExp(Element* element);
    2627                void           CreateDamageFInputPralong(Element* element);
  • issm/trunk-jpl/src/c/modules/Damagex/Damagex.cpp

    r19388 r24146  
    2424                        /* Damage calculated using source term in DamageEvolutionAnalysis */
    2525                        break;
     26                case 3:
     27                        if(VerboseModule()) _printf0_("   computing damage using source term in advection scheme\n");
     28                        /* Damage calculated using source term in DamageEvolutionAnalysis */
     29                        break;
    2630                default:
    2731                        _error_("Damage law "<<EnumToStringx(damagelaw)<<" not implemented yet");
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r24145 r24146  
    109109        DamageC2Enum,
    110110        DamageC3Enum,
     111        DamageC4Enum,
    111112        DamageEnum,
    112113        DamageEquivStressEnum,
     
    119120        DamageStabilizationEnum,
    120121        DamageStressThresholdEnum,
     122        DamageStressUBoundEnum,
    121123        DebugProfilingEnum,
    122124        DomainDimensionEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r24145 r24146  
    117117                case DamageC2Enum : return "DamageC2";
    118118                case DamageC3Enum : return "DamageC3";
     119                case DamageC4Enum : return "DamageC4";
    119120                case DamageEnum : return "Damage";
    120121                case DamageEquivStressEnum : return "DamageEquivStress";
     
    127128                case DamageStabilizationEnum : return "DamageStabilization";
    128129                case DamageStressThresholdEnum : return "DamageStressThreshold";
     130                case DamageStressUBoundEnum : return "DamageStressUBound";
    129131                case DebugProfilingEnum : return "DebugProfiling";
    130132                case DomainDimensionEnum : return "DomainDimension";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r24145 r24146  
    117117              else if (strcmp(name,"DamageC2")==0) return DamageC2Enum;
    118118              else if (strcmp(name,"DamageC3")==0) return DamageC3Enum;
     119              else if (strcmp(name,"DamageC4")==0) return DamageC4Enum;
    119120              else if (strcmp(name,"Damage")==0) return DamageEnum;
    120121              else if (strcmp(name,"DamageEquivStress")==0) return DamageEquivStressEnum;
     
    127128              else if (strcmp(name,"DamageStabilization")==0) return DamageStabilizationEnum;
    128129              else if (strcmp(name,"DamageStressThreshold")==0) return DamageStressThresholdEnum;
     130              else if (strcmp(name,"DamageStressUBound")==0) return DamageStressUBoundEnum;
    129131              else if (strcmp(name,"DebugProfiling")==0) return DebugProfilingEnum;
    130132              else if (strcmp(name,"DomainDimension")==0) return DomainDimensionEnum;
     
    135137              else if (strcmp(name,"EsaHemisphere")==0) return EsaHemisphereEnum;
    136138              else if (strcmp(name,"EsaRequestedOutputs")==0) return EsaRequestedOutputsEnum;
    137               else if (strcmp(name,"EsaUElastic")==0) return EsaUElasticEnum;
    138               else if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
    139139         else stage=2;
    140140   }
    141141   if(stage==2){
    142               if (strcmp(name,"FemModelComm")==0) return FemModelCommEnum;
     142              if (strcmp(name,"EsaUElastic")==0) return EsaUElasticEnum;
     143              else if (strcmp(name,"ExtrapolationVariable")==0) return ExtrapolationVariableEnum;
     144              else if (strcmp(name,"FemModelComm")==0) return FemModelCommEnum;
    143145              else if (strcmp(name,"FlowequationFeFS")==0) return FlowequationFeFSEnum;
    144146              else if (strcmp(name,"FlowequationIsFS")==0) return FlowequationIsFSEnum;
     
    258260              else if (strcmp(name,"MaterialsLithosphereShearModulus")==0) return MaterialsLithosphereShearModulusEnum;
    259261              else if (strcmp(name,"MaterialsMantleDensity")==0) return MaterialsMantleDensityEnum;
    260               else if (strcmp(name,"MaterialsMantleShearModulus")==0) return MaterialsMantleShearModulusEnum;
    261               else if (strcmp(name,"MaterialsMeltingpoint")==0) return MaterialsMeltingpointEnum;
    262262         else stage=3;
    263263   }
    264264   if(stage==3){
    265               if (strcmp(name,"MaterialsMixedLayerCapacity")==0) return MaterialsMixedLayerCapacityEnum;
     265              if (strcmp(name,"MaterialsMantleShearModulus")==0) return MaterialsMantleShearModulusEnum;
     266              else if (strcmp(name,"MaterialsMeltingpoint")==0) return MaterialsMeltingpointEnum;
     267              else if (strcmp(name,"MaterialsMixedLayerCapacity")==0) return MaterialsMixedLayerCapacityEnum;
    266268              else if (strcmp(name,"MaterialsMuWater")==0) return MaterialsMuWaterEnum;
    267269              else if (strcmp(name,"MaterialsRheologyLaw")==0) return MaterialsRheologyLawEnum;
     
    381383              else if (strcmp(name,"SmbSealev")==0) return SmbSealevEnum;
    382384              else if (strcmp(name,"SmbSwIdx")==0) return SmbSwIdxEnum;
    383               else if (strcmp(name,"SmbT0dry")==0) return SmbT0dryEnum;
    384               else if (strcmp(name,"SmbT0wet")==0) return SmbT0wetEnum;
    385385         else stage=4;
    386386   }
    387387   if(stage==4){
    388               if (strcmp(name,"SmbTdiff")==0) return SmbTdiffEnum;
     388              if (strcmp(name,"SmbT0dry")==0) return SmbT0dryEnum;
     389              else if (strcmp(name,"SmbT0wet")==0) return SmbT0wetEnum;
     390              else if (strcmp(name,"SmbTdiff")==0) return SmbTdiffEnum;
    389391              else if (strcmp(name,"SmbThermoDeltaTScaling")==0) return SmbThermoDeltaTScalingEnum;
    390392              else if (strcmp(name,"SmoothThicknessMultiplier")==0) return SmoothThicknessMultiplierEnum;
     
    504506              else if (strcmp(name,"DamageD")==0) return DamageDEnum;
    505507              else if (strcmp(name,"DamageDbar")==0) return DamageDbarEnum;
    506               else if (strcmp(name,"DamageF")==0) return DamageFEnum;
    507               else if (strcmp(name,"DegreeOfChannelization")==0) return DegreeOfChannelizationEnum;
    508508         else stage=5;
    509509   }
    510510   if(stage==5){
    511               if (strcmp(name,"DeviatoricStresseffective")==0) return DeviatoricStresseffectiveEnum;
     511              if (strcmp(name,"DamageF")==0) return DamageFEnum;
     512              else if (strcmp(name,"DegreeOfChannelization")==0) return DegreeOfChannelizationEnum;
     513              else if (strcmp(name,"DeviatoricStresseffective")==0) return DeviatoricStresseffectiveEnum;
    512514              else if (strcmp(name,"DeviatoricStressxx")==0) return DeviatoricStressxxEnum;
    513515              else if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum;
     
    627629              else if (strcmp(name,"MaterialsRheologyEc")==0) return MaterialsRheologyEcEnum;
    628630              else if (strcmp(name,"MaterialsRheologyEcbar")==0) return MaterialsRheologyEcbarEnum;
    629               else if (strcmp(name,"MaterialsRheologyEs")==0) return MaterialsRheologyEsEnum;
    630               else if (strcmp(name,"MaterialsRheologyEsbar")==0) return MaterialsRheologyEsbarEnum;
    631631         else stage=6;
    632632   }
    633633   if(stage==6){
    634               if (strcmp(name,"MaterialsRheologyN")==0) return MaterialsRheologyNEnum;
     634              if (strcmp(name,"MaterialsRheologyEs")==0) return MaterialsRheologyEsEnum;
     635              else if (strcmp(name,"MaterialsRheologyEsbar")==0) return MaterialsRheologyEsbarEnum;
     636              else if (strcmp(name,"MaterialsRheologyN")==0) return MaterialsRheologyNEnum;
    635637              else if (strcmp(name,"MeshScaleFactor")==0) return MeshScaleFactorEnum;
    636638              else if (strcmp(name,"MeshVertexonbase")==0) return MeshVertexonbaseEnum;
     
    750752              else if (strcmp(name,"SmbTemperaturesAnomaly")==0) return SmbTemperaturesAnomalyEnum;
    751753              else if (strcmp(name,"SmbTemperaturesLgm")==0) return SmbTemperaturesLgmEnum;
    752               else if (strcmp(name,"SmbTemperaturesPresentday")==0) return SmbTemperaturesPresentdayEnum;
    753               else if (strcmp(name,"SmbTemperaturesReconstructed")==0) return SmbTemperaturesReconstructedEnum;
    754754         else stage=7;
    755755   }
    756756   if(stage==7){
    757               if (strcmp(name,"SmbTini")==0) return SmbTiniEnum;
     757              if (strcmp(name,"SmbTemperaturesPresentday")==0) return SmbTemperaturesPresentdayEnum;
     758              else if (strcmp(name,"SmbTemperaturesReconstructed")==0) return SmbTemperaturesReconstructedEnum;
     759              else if (strcmp(name,"SmbTini")==0) return SmbTiniEnum;
    758760              else if (strcmp(name,"SmbTmean")==0) return SmbTmeanEnum;
    759761              else if (strcmp(name,"SmbTz")==0) return SmbTzEnum;
     
    873875              else if (strcmp(name,"Outputdefinition49")==0) return Outputdefinition49Enum;
    874876              else if (strcmp(name,"Outputdefinition4")==0) return Outputdefinition4Enum;
    875               else if (strcmp(name,"Outputdefinition50")==0) return Outputdefinition50Enum;
    876               else if (strcmp(name,"Outputdefinition51")==0) return Outputdefinition51Enum;
    877877         else stage=8;
    878878   }
    879879   if(stage==8){
    880               if (strcmp(name,"Outputdefinition52")==0) return Outputdefinition52Enum;
     880              if (strcmp(name,"Outputdefinition50")==0) return Outputdefinition50Enum;
     881              else if (strcmp(name,"Outputdefinition51")==0) return Outputdefinition51Enum;
     882              else if (strcmp(name,"Outputdefinition52")==0) return Outputdefinition52Enum;
    881883              else if (strcmp(name,"Outputdefinition53")==0) return Outputdefinition53Enum;
    882884              else if (strcmp(name,"Outputdefinition54")==0) return Outputdefinition54Enum;
     
    996998              else if (strcmp(name,"Dense")==0) return DenseEnum;
    997999              else if (strcmp(name,"DependentObject")==0) return DependentObjectEnum;
    998               else if (strcmp(name,"DepthAverageAnalysis")==0) return DepthAverageAnalysisEnum;
    999               else if (strcmp(name,"DeviatoricStressErrorEstimator")==0) return DeviatoricStressErrorEstimatorEnum;
    10001000         else stage=9;
    10011001   }
    10021002   if(stage==9){
    1003               if (strcmp(name,"Divergence")==0) return DivergenceEnum;
     1003              if (strcmp(name,"DepthAverageAnalysis")==0) return DepthAverageAnalysisEnum;
     1004              else if (strcmp(name,"DeviatoricStressErrorEstimator")==0) return DeviatoricStressErrorEstimatorEnum;
     1005              else if (strcmp(name,"Divergence")==0) return DivergenceEnum;
    10041006              else if (strcmp(name,"Domain3Dsurface")==0) return Domain3DsurfaceEnum;
    10051007              else if (strcmp(name,"DoubleArrayInput")==0) return DoubleArrayInputEnum;
     
    11191121              else if (strcmp(name,"Masscon")==0) return MassconEnum;
    11201122              else if (strcmp(name,"Massconaxpby")==0) return MassconaxpbyEnum;
    1121               else if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
    1122               else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
     1126              if (strcmp(name,"Massfluxatgate")==0) return MassfluxatgateEnum;
     1127              else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
     1128              else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
    11271129              else if (strcmp(name,"Matdamageice")==0) return MatdamageiceEnum;
    11281130              else if (strcmp(name,"Matenhancedice")==0) return MatenhancediceEnum;
     
    12421244              else if (strcmp(name,"SteadystateSolution")==0) return SteadystateSolutionEnum;
    12431245              else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum;
    1244               else if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum;
    1245               else if (strcmp(name,"StressbalanceConvergenceNumSteps")==0) return StressbalanceConvergenceNumStepsEnum;
    12461246         else stage=11;
    12471247   }
    12481248   if(stage==11){
    1249               if (strcmp(name,"StressbalanceSIAAnalysis")==0) return StressbalanceSIAAnalysisEnum;
     1249              if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum;
     1250              else if (strcmp(name,"StressbalanceConvergenceNumSteps")==0) return StressbalanceConvergenceNumStepsEnum;
     1251              else if (strcmp(name,"StressbalanceSIAAnalysis")==0) return StressbalanceSIAAnalysisEnum;
    12501252              else if (strcmp(name,"StressbalanceSolution")==0) return StressbalanceSolutionEnum;
    12511253              else if (strcmp(name,"StressbalanceVerticalAnalysis")==0) return StressbalanceVerticalAnalysisEnum;
  • issm/trunk-jpl/src/m/classes/damage.m

    r21049 r24146  
    2020                %general parameters for evolution law:
    2121                stress_threshold    = 0;
     22                stress_ubound       = 0;
    2223                kappa               = 0;
    2324                c1                  = 0;
     
    8889                        md = checkfield(md,'fieldname','damage.isdamage','values',[1,0]);
    8990                        if self.isdamage,
    90                                 md = checkfield(md,'fieldname','damage.law','numel',[1],'values',[0,1,2]);
     91                                md = checkfield(md,'fieldname','damage.law','numel',[1],'values',[0,1,2,3]);
    9192                                md = checkfield(md,'fieldname','damage.D','>=',0,'<=',self.max_damage,'size',[md.mesh.numberofvertices 1]);
    9293                                md = checkfield(md,'fieldname','damage.spcdamage','Inf',1,'timeseries',1);
     
    9697                                md = checkfield(md,'fieldname','damage.elementinterp','values',{'P1','P2'});
    9798                                md = checkfield(md,'fieldname','damage.stress_threshold','>=',0);
     99                                md = checkfield(md,'fieldname','damage.stress_ubound','>=',0);
    98100                                md = checkfield(md,'fieldname','damage.kappa','>',1);
    99101                                md = checkfield(md,'fieldname','damage.healing','>=',0);
     
    131133                                fielddisplay(self,'maxiter','maximum number of non linear iterations');
    132134                                fielddisplay(self,'elementinterp','interpolation scheme for finite elements {''P1'',''P2''}');
    133                                 fielddisplay(self,'stress_threshold','stress threshold for damage initiation [Pa]');
     135                                fielddisplay(self,'stress_threshold','stress threshold for damage initiation (Pa)');
     136                                fielddisplay(self,'stress_ubound','stress upper bound for damage healing (Pa), arctan law');
    134137                                fielddisplay(self,'kappa','ductility parameter for stress softening and damage');
    135138                                fielddisplay(self,'c1','damage parameter 1');
     
    156159                                WriteData(fid,prefix,'name','md.damage.elementinterp','data',self.elementinterp,'format','String');
    157160                                WriteData(fid,prefix,'object',self,'fieldname','stress_threshold','format','Double');
     161                                WriteData(fid,prefix,'object',self,'fieldname','stress_ubound','format','Double');
    158162                                WriteData(fid,prefix,'object',self,'fieldname','kappa','format','Double');
    159163                                WriteData(fid,prefix,'object',self,'fieldname','c1','format','Double');
  • issm/trunk-jpl/src/m/classes/damage.py

    r23716 r24146  
    2727                #general parameters for evolution law:
    2828                self.stress_threshold  = float('NaN')
     29                self.stress_ubound     = float('NaN')
    2930                self.kappa             = float('NaN')
    3031                self.c1                = float('NaN')
     
    5354                        s+="%s\n" % fielddisplay(self,"maxiter","maximum number of non linear iterations")
    5455                        s+="%s\n" %     fielddisplay(self,"elementinterp","interpolation scheme for finite elements [''P1'',''P2'']")
    55                         s+="%s\n" % fielddisplay(self,"stress_threshold","stress threshold for damage initiation [Pa]")
     56                        s+="%s\n" % fielddisplay(self,"stress_threshold","stress threshold for damage initiation (Pa)")
     57                        s+="%s\n" % fielddisplay(self,"stress_ubound","stress upper bound for damage healing (Pa)")
    5658                        s+="%s\n" % fielddisplay(self,"kappa","ductility parameter for stress softening and damage [>1]")
    5759                        s+="%s\n" % fielddisplay(self,"c1","damage parameter 1 ")
     
    123125                        md = checkfield(md,'fieldname','damage.elementinterp','values',['P1','P2'])
    124126                        md = checkfield(md,'fieldname','damage.stress_threshold','>=',0)
     127                        md = checkfield(md,'fieldname','damage.stress_ubound','>=',0)
    125128                        md = checkfield(md,'fieldname','damage.kappa','>',1)
    126129                        md = checkfield(md,'fieldname','damage.healing','>=',0)
     
    150153                        WriteData(fid,prefix,'name','md.damage.elementinterp','data',self.elementinterp,'format','String')
    151154                        WriteData(fid,prefix,'object',self,'fieldname','stress_threshold','format','Double')
     155                        WriteData(fid,prefix,'object',self,'fieldname','stress_ubound','format','Double')
    152156                        WriteData(fid,prefix,'object',self,'fieldname','kappa','format','Double')
    153157                        WriteData(fid,prefix,'object',self,'fieldname','c1','format','Double')
Note: See TracChangeset for help on using the changeset viewer.