Changeset 27278


Ignore:
Timestamp:
09/10/22 08:38:49 (3 years ago)
Author:
vverjans
Message:

NEW: added possibility to use thermal forcing in basalforcingsbeckmanngoosse and ensures compatibility with thermal forcing of frontalforcingsrignot

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

Legend:

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

    r27102 r27278  
    125125                        break;
    126126                case BeckmannGoosseFloatingMeltRateEnum:
     127                        bool isthermalforcing;
     128         iomodel->FindConstant(&isthermalforcing,"md.basalforcings.isthermalforcing");
    127129                        iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.meltrate_factor",BasalforcingsMeltrateFactorEnum);
    128                         iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
    129                         iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
     130         if(isthermalforcing==0){
     131            iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
     132            iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
     133         }
     134         else{
     135            iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_thermalforcing",FrontalForcingsAndBasalforcingsThermalForcingEnum);
     136         }
    130137                        break;
    131138                default:
  • issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp

    r27261 r27278  
    150150                case FrontalForcingsRignotEnum:
    151151         /*Retrieve thermal forcing only in the case of non-arma FrontalForcingsRignot*/
    152          iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.thermalforcing",FrontalForcingsThermalForcingEnum);
     152         iomodel->FetchDataToInput(inputs,elements,"md.frontalforcings.thermalforcing",FrontalForcingsAndBasalforcingsThermalForcingEnum);
    153153         /* Do not break here, still retrieve basin_ID,subglacial_discharge, etc.*/
    154154      case FrontalForcingsRignotarmaEnum:
  • issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp

    r27250 r27278  
    215215                        break;
    216216                case BeckmannGoosseFloatingMeltRateEnum:
     217                        bool isthermalforcing;
     218                        iomodel->FindConstant(&isthermalforcing,"md.basalforcings.isthermalforcing");
    217219                        iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.meltrate_factor",BasalforcingsMeltrateFactorEnum);
    218                         iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
    219                         iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
     220                        if(isthermalforcing==0){
     221                                iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
     222                                iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
     223                        }
     224                        else{
     225                                iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_thermalforcing",FrontalForcingsAndBasalforcingsThermalForcingEnum);
     226                        }
    220227                        break;
    221228                case LinearFloatingMeltRatearmaEnum:
  • issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

    r27102 r27278  
    853853                                break;
    854854                        case BeckmannGoosseFloatingMeltRateEnum:
    855                                 iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.basin_id",BasalforcingsIsmip6BasinIdEnum);
    856                                 iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
    857                                 iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
     855                                bool isthermalforcing;
     856                                iomodel->FindConstant(&isthermalforcing,"md.basalforcings.isthermalforcing");
     857           iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.meltrate_factor",BasalforcingsMeltrateFactorEnum);
     858           if(isthermalforcing==0){
     859              iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
     860              iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
     861           }
     862           else{
     863              iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_thermalforcing",FrontalForcingsAndBasalforcingsThermalForcingEnum);
     864           }
    858865                                break;
    859866                        default:
  • issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp

    r27102 r27278  
    155155                        break;
    156156                case BeckmannGoosseFloatingMeltRateEnum:
     157                        bool isthermalforcing;
     158         iomodel->FindConstant(&isthermalforcing,"md.basalforcings.isthermalforcing");
    157159                        iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.meltrate_factor",BasalforcingsMeltrateFactorEnum);
    158                         iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
    159                         iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
     160         if(isthermalforcing==0){
     161            iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_salinity",BasalforcingsOceanSalinityEnum);
     162            iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_temp",BasalforcingsOceanTempEnum);
     163         }
     164         else{
     165            iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.ocean_thermalforcing",FrontalForcingsAndBasalforcingsThermalForcingEnum);
     166         }
    160167                        break;
    161168                default:
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r27260 r27278  
    8686         basinenum_type = FrontalForcingsBasinIdEnum;
    8787         noiseenum_type = ThermalforcingARMANoiseEnum;
    88          outenum_type   = FrontalForcingsThermalForcingEnum;
     88         outenum_type   = FrontalForcingsAndBasalforcingsThermalForcingEnum;
    8989         break;
    9090                case(BasalforcingsDeepwaterMeltingRatearmaEnum):
     
    195195         basinenum_type = FrontalForcingsBasinIdEnum;
    196196         noiseenum_type = ThermalforcingARMANoiseEnum;
    197          outenum_type   = FrontalForcingsThermalForcingEnum;
     197         outenum_type   = FrontalForcingsAndBasalforcingsThermalForcingEnum;
    198198         break;
    199199                case(BasalforcingsDeepwaterMeltingRatearmaEnum):
     
    27772777void       Element::BeckmannGoosseFloatingiceMeltingRate(){/*{{{*/
    27782778
    2779         int numvertices      = this->GetNumberOfVertices();
    2780         IssmDouble T_f,ocean_heat_flux;
    2781         IssmDouble rho_water    = this->FindParam(MaterialsRhoSeawaterEnum);
    2782         IssmDouble rho_ice      = this->FindParam(MaterialsRhoIceEnum);
    2783         IssmDouble latentheat   = this->FindParam(MaterialsLatentheatEnum);
     2779        bool isthermalforcing;       
     2780        int numvertices                 = this->GetNumberOfVertices();
     2781        IssmDouble T_fr,T_forcing,ocean_heat_flux;
     2782        /*Material properties*/
     2783        IssmDouble rho_water            = this->FindParam(MaterialsRhoSeawaterEnum);
     2784        IssmDouble rho_ice              = this->FindParam(MaterialsRhoIceEnum);
     2785        IssmDouble latentheat           = this->FindParam(MaterialsLatentheatEnum);
    27842786        IssmDouble mixed_layer_capacity = this->FindParam(MaterialsMixedLayerCapacityEnum);
    27852787        IssmDouble thermal_exchange_vel = this->FindParam(MaterialsThermalExchangeVelocityEnum);
     
    27892791        IssmDouble oceansalinity [MAXVERTICES];
    27902792        IssmDouble oceantemp[MAXVERTICES];
     2793        IssmDouble oceanthermalforcing[MAXVERTICES];
    27912794        IssmDouble meltratefactor[MAXVERTICES];
    27922795
     2796        /*Determine if we use temperature-and-salinity or thermal forcing*/
     2797        this->parameters->FindParam(&isthermalforcing,BasalforcingsIsThermalForcingEnum);
     2798        /*Retrieve Inputs*/
    27932799        this->GetInputListOnVertices(base,BaseEnum);
    2794         this->GetInputListOnVertices(oceansalinity,BasalforcingsOceanSalinityEnum);
    2795         this->GetInputListOnVertices(oceantemp,BasalforcingsOceanTempEnum);
    27962800        this->GetInputListOnVertices(meltratefactor,BasalforcingsMeltrateFactorEnum);
     2801        if(isthermalforcing==false){
     2802                this->GetInputListOnVertices(oceansalinity,BasalforcingsOceanSalinityEnum);
     2803                this->GetInputListOnVertices(oceantemp,BasalforcingsOceanTempEnum);
     2804        }
     2805        else{
     2806                this->GetInputListOnVertices(oceanthermalforcing,FrontalForcingsAndBasalforcingsThermalForcingEnum);
     2807        }
    27972808
    27982809        Gauss* gauss=this->NewGauss();
    27992810        for(int i=0;i<numvertices;i++){
    2800                 T_f=(0.0939 - 0.057 * oceansalinity[i] + 7.64e-4 * base[i]); //degC
    2801 
    2802                 // compute ocean_heat_flux according to beckmann_goosse2003
    2803                 // positive, if T_oc > T_ice ==> heat flux FROM ocean TO ice
    2804                 ocean_heat_flux = meltratefactor[i] * rho_water * mixed_layer_capacity * thermal_exchange_vel * (oceantemp[i] - T_f); // in W/m^2
    2805 
    2806                 // shelfbmassflux is positive if ice is freezing on; here it is always negative:
    2807                 // same sign as ocean_heat_flux (positive if massflux FROM ice TO ocean)
    2808                 values[i] = ocean_heat_flux / (latentheat * rho_ice); // m s-1
    2809         }
    2810 
     2811                /*Case of temperature-and-salinity inputs*/
     2812                if(isthermalforcing==false){
     2813                        T_fr       = (0.0939-0.057*oceansalinity[i]+7.64e-4*base[i]); //freezing point [degC]
     2814                        T_forcing  = oceantemp[i]-T_fr; //thermal forcing [K]
     2815                }
     2816                /*Case of thermal forcing input*/
     2817                else{
     2818                        T_forcing  = oceanthermalforcing[i];
     2819                }
     2820                /*Compute heat flux from (Beckmann and Goosse, 2003) (>0 means heat flux from ocean to ice)*/
     2821                ocean_heat_flux = meltratefactor[i]*rho_water*mixed_layer_capacity*thermal_exchange_vel*T_forcing; // ocean-to-ice heat flux [W/m^2]
     2822                /*Save melt values [m/s]*/
     2823                values[i]       = ocean_heat_flux/(latentheat*rho_ice);
     2824        }
    28112825        this->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum);
    28122826        delete gauss;
     
    37993813        Input* bed_input = this->GetInput(BedEnum);                     _assert_(bed_input);
    38003814   Input* qsg_input = this->GetInput(FrontalForcingsSubglacialDischargeEnum);     _assert_(qsg_input);
    3801    Input* TF_input  = this->GetInput(FrontalForcingsThermalForcingEnum);          _assert_(TF_input);
     3815   Input* TF_input  = this->GetInput(FrontalForcingsAndBasalforcingsThermalForcingEnum);          _assert_(TF_input);
    38023816
    38033817        this->FindParam(&yts, ConstantsYtsEnum);
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp

    r27250 r27278  
    253253                        break;
    254254                case BeckmannGoosseFloatingMeltRateEnum:
     255                        parameters->AddObject(iomodel->CopyConstantObject("md.basalforcings.isthermalforcing",BasalforcingsIsThermalForcingEnum));
    255256                        break;
    256257                case LinearFloatingMeltRatearmaEnum:
  • issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r27260 r27278  
    9292syn keyword cConstant BasalforcingsARMAarlagcoefsEnum
    9393syn keyword cConstant BasalforcingsARMAmalagcoefsEnum
     94syn keyword cConstant BasalforcingsIsThermalForcingEnum
    9495syn keyword cConstant BasalforcingsPicoAverageOverturningEnum
    9596syn keyword cConstant BasalforcingsPicoAverageSalinityEnum
     
    775776syn keyword cConstant FrontalForcingsBasinIdEnum
    776777syn keyword cConstant FrontalForcingsSubglacialDischargeEnum
    777 syn keyword cConstant FrontalForcingsThermalForcingEnum
     778syn keyword cConstant FrontalForcingsAndBasalforcingsThermalForcingEnum
    778779syn keyword cConstant GeometryHydrostaticRatioEnum
    779780syn keyword cConstant NGiaEnum
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r27260 r27278  
    8686        BasalforcingsARMAarlagcoefsEnum,
    8787        BasalforcingsARMAmalagcoefsEnum,
     88        BasalforcingsIsThermalForcingEnum,
    8889        BasalforcingsPicoAverageOverturningEnum,
    8990        BasalforcingsPicoAverageSalinityEnum,
     
    771772        FrontalForcingsBasinIdEnum,
    772773        FrontalForcingsSubglacialDischargeEnum,
    773         FrontalForcingsThermalForcingEnum,
     774        FrontalForcingsAndBasalforcingsThermalForcingEnum,
    774775        GeometryHydrostaticRatioEnum,
    775776        NGiaEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r27260 r27278  
    9494                case BasalforcingsARMAarlagcoefsEnum : return "BasalforcingsARMAarlagcoefs";
    9595                case BasalforcingsARMAmalagcoefsEnum : return "BasalforcingsARMAmalagcoefs";
     96                case BasalforcingsIsThermalForcingEnum : return "BasalforcingsIsThermalForcing";
    9697                case BasalforcingsPicoAverageOverturningEnum : return "BasalforcingsPicoAverageOverturning";
    9798                case BasalforcingsPicoAverageSalinityEnum : return "BasalforcingsPicoAverageSalinity";
     
    777778                case FrontalForcingsBasinIdEnum : return "FrontalForcingsBasinId";
    778779                case FrontalForcingsSubglacialDischargeEnum : return "FrontalForcingsSubglacialDischarge";
    779                 case FrontalForcingsThermalForcingEnum : return "FrontalForcingsThermalForcing";
     780                case FrontalForcingsAndBasalforcingsThermalForcingEnum : return "FrontalForcingsAndBasalforcingsThermalForcing";
    780781                case GeometryHydrostaticRatioEnum : return "GeometryHydrostaticRatio";
    781782                case NGiaEnum : return "NGia";
  • issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim

    r27260 r27278  
    8585syn keyword juliaConstC BasalforcingsARMAarlagcoefsEnum
    8686syn keyword juliaConstC BasalforcingsARMAmalagcoefsEnum
     87syn keyword juliaConstC BasalforcingsIsThermalForcingEnum
    8788syn keyword juliaConstC BasalforcingsPicoAverageOverturningEnum
    8889syn keyword juliaConstC BasalforcingsPicoAverageSalinityEnum
     
    768769syn keyword juliaConstC FrontalForcingsBasinIdEnum
    769770syn keyword juliaConstC FrontalForcingsSubglacialDischargeEnum
    770 syn keyword juliaConstC FrontalForcingsThermalForcingEnum
     771syn keyword juliaConstC FrontalForcingsAndBasalforcingsThermalForcingEnum
    771772syn keyword juliaConstC GeometryHydrostaticRatioEnum
    772773syn keyword juliaConstC NGiaEnum
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r27260 r27278  
    9494              else if (strcmp(name,"BasalforcingsARMAarlagcoefs")==0) return BasalforcingsARMAarlagcoefsEnum;
    9595              else if (strcmp(name,"BasalforcingsARMAmalagcoefs")==0) return BasalforcingsARMAmalagcoefsEnum;
     96              else if (strcmp(name,"BasalforcingsIsThermalForcing")==0) return BasalforcingsIsThermalForcingEnum;
    9697              else if (strcmp(name,"BasalforcingsPicoAverageOverturning")==0) return BasalforcingsPicoAverageOverturningEnum;
    9798              else if (strcmp(name,"BasalforcingsPicoAverageSalinity")==0) return BasalforcingsPicoAverageSalinityEnum;
     
    136137              else if (strcmp(name,"ConstantsYts")==0) return ConstantsYtsEnum;
    137138              else if (strcmp(name,"ControlInputSizeM")==0) return ControlInputSizeMEnum;
    138               else if (strcmp(name,"ControlInputSizeN")==0) return ControlInputSizeNEnum;
    139139         else stage=2;
    140140   }
    141141   if(stage==2){
    142               if (strcmp(name,"ControlInputInterpolation")==0) return ControlInputInterpolationEnum;
     142              if (strcmp(name,"ControlInputSizeN")==0) return ControlInputSizeNEnum;
     143              else if (strcmp(name,"ControlInputInterpolation")==0) return ControlInputInterpolationEnum;
    143144              else if (strcmp(name,"CumBslc")==0) return CumBslcEnum;
    144145              else if (strcmp(name,"CumBslcIce")==0) return CumBslcIceEnum;
     
    259260              else if (strcmp(name,"HydrologydcTransferFlag")==0) return HydrologydcTransferFlagEnum;
    260261              else if (strcmp(name,"HydrologydcUnconfinedFlag")==0) return HydrologydcUnconfinedFlagEnum;
    261               else if (strcmp(name,"HydrologyshreveStabilization")==0) return HydrologyshreveStabilizationEnum;
    262262         else stage=3;
    263263   }
    264264   if(stage==3){
    265               if (strcmp(name,"IcecapToEarthComm")==0) return IcecapToEarthCommEnum;
     265              if (strcmp(name,"HydrologyshreveStabilization")==0) return HydrologyshreveStabilizationEnum;
     266              else if (strcmp(name,"IcecapToEarthComm")==0) return IcecapToEarthCommEnum;
    266267              else if (strcmp(name,"Index")==0) return IndexEnum;
    267268              else if (strcmp(name,"InputFileName")==0) return InputFileNameEnum;
     
    382383              else if (strcmp(name,"QmuVariablePartitions")==0) return QmuVariablePartitionsEnum;
    383384              else if (strcmp(name,"QmuVariablePartitionsNpart")==0) return QmuVariablePartitionsNpartEnum;
    384               else if (strcmp(name,"QmuVariablePartitionsNt")==0) return QmuVariablePartitionsNtEnum;
    385385         else stage=4;
    386386   }
    387387   if(stage==4){
    388               if (strcmp(name,"QmuResponsePartitions")==0) return QmuResponsePartitionsEnum;
     388              if (strcmp(name,"QmuVariablePartitionsNt")==0) return QmuVariablePartitionsNtEnum;
     389              else if (strcmp(name,"QmuResponsePartitions")==0) return QmuResponsePartitionsEnum;
    389390              else if (strcmp(name,"QmuResponsePartitionsNpart")==0) return QmuResponsePartitionsNpartEnum;
    390391              else if (strcmp(name,"QmuStatistics")==0) return QmuStatisticsEnum;
     
    505506              else if (strcmp(name,"SmbDelta18o")==0) return SmbDelta18oEnum;
    506507              else if (strcmp(name,"SmbDelta18oSurface")==0) return SmbDelta18oSurfaceEnum;
    507               else if (strcmp(name,"SmbDenIdx")==0) return SmbDenIdxEnum;
    508508         else stage=5;
    509509   }
    510510   if(stage==5){
    511               if (strcmp(name,"SmbDt")==0) return SmbDtEnum;
     511              if (strcmp(name,"SmbDenIdx")==0) return SmbDenIdxEnum;
     512              else if (strcmp(name,"SmbDt")==0) return SmbDtEnum;
    512513              else if (strcmp(name,"Smb")==0) return SmbEnum;
    513514              else if (strcmp(name,"SmbEIdx")==0) return SmbEIdxEnum;
     
    628629              else if (strcmp(name,"Yye")==0) return YyeEnum;
    629630              else if (strcmp(name,"Zze")==0) return ZzeEnum;
    630               else if (strcmp(name,"Areae")==0) return AreaeEnum;
    631631         else stage=6;
    632632   }
    633633   if(stage==6){
    634               if (strcmp(name,"WorldComm")==0) return WorldCommEnum;
     634              if (strcmp(name,"Areae")==0) return AreaeEnum;
     635              else if (strcmp(name,"WorldComm")==0) return WorldCommEnum;
    635636              else if (strcmp(name,"ParametersEND")==0) return ParametersENDEnum;
    636637              else if (strcmp(name,"InputsSTART")==0) return InputsSTARTEnum;
     
    751752              else if (strcmp(name,"DrivingStressY")==0) return DrivingStressYEnum;
    752753              else if (strcmp(name,"Dummy")==0) return DummyEnum;
    753               else if (strcmp(name,"EffectivePressure")==0) return EffectivePressureEnum;
    754754         else stage=7;
    755755   }
    756756   if(stage==7){
    757               if (strcmp(name,"EffectivePressureSubstep")==0) return EffectivePressureSubstepEnum;
     757              if (strcmp(name,"EffectivePressure")==0) return EffectivePressureEnum;
     758              else if (strcmp(name,"EffectivePressureSubstep")==0) return EffectivePressureSubstepEnum;
    758759              else if (strcmp(name,"EffectivePressureTransient")==0) return EffectivePressureTransientEnum;
    759760              else if (strcmp(name,"Enthalpy")==0) return EnthalpyEnum;
     
    795796              else if (strcmp(name,"FrontalForcingsBasinId")==0) return FrontalForcingsBasinIdEnum;
    796797              else if (strcmp(name,"FrontalForcingsSubglacialDischarge")==0) return FrontalForcingsSubglacialDischargeEnum;
    797               else if (strcmp(name,"FrontalForcingsThermalForcing")==0) return FrontalForcingsThermalForcingEnum;
     798              else if (strcmp(name,"FrontalForcingsAndBasalforcingsThermalForcing")==0) return FrontalForcingsAndBasalforcingsThermalForcingEnum;
    798799              else if (strcmp(name,"GeometryHydrostaticRatio")==0) return GeometryHydrostaticRatioEnum;
    799800              else if (strcmp(name,"NGia")==0) return NGiaEnum;
     
    874875              else if (strcmp(name,"MovingFrontalVx")==0) return MovingFrontalVxEnum;
    875876              else if (strcmp(name,"MovingFrontalVy")==0) return MovingFrontalVyEnum;
    876               else if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum;
    877877         else stage=8;
    878878   }
    879879   if(stage==8){
    880               if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
     880              if (strcmp(name,"Neumannflux")==0) return NeumannfluxEnum;
     881              else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
    881882              else if (strcmp(name,"Node")==0) return NodeEnum;
    882883              else if (strcmp(name,"OmegaAbsGradient")==0) return OmegaAbsGradientEnum;
     
    997998              else if (strcmp(name,"SmbCotValue")==0) return SmbCotValueEnum;
    998999              else if (strcmp(name,"SmbD")==0) return SmbDEnum;
    999               else if (strcmp(name,"SmbDailyairdensity")==0) return SmbDailyairdensityEnum;
    10001000         else stage=9;
    10011001   }
    10021002   if(stage==9){
    1003               if (strcmp(name,"SmbDailyairhumidity")==0) return SmbDailyairhumidityEnum;
     1003              if (strcmp(name,"SmbDailyairdensity")==0) return SmbDailyairdensityEnum;
     1004              else if (strcmp(name,"SmbDailyairhumidity")==0) return SmbDailyairhumidityEnum;
    10041005              else if (strcmp(name,"SmbDailydlradiation")==0) return SmbDailydlradiationEnum;
    10051006              else if (strcmp(name,"SmbDailydsradiation")==0) return SmbDailydsradiationEnum;
     
    11201121              else if (strcmp(name,"SurfaceOld")==0) return SurfaceOldEnum;
    11211122              else if (strcmp(name,"SurfaceLogVelMisfit")==0) return SurfaceLogVelMisfitEnum;
    1122               else if (strcmp(name,"SurfaceLogVxVyMisfit")==0) return SurfaceLogVxVyMisfitEnum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
     1126              if (strcmp(name,"SurfaceLogVxVyMisfit")==0) return SurfaceLogVxVyMisfitEnum;
     1127              else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
    11271128              else if (strcmp(name,"SurfaceRelVelMisfit")==0) return SurfaceRelVelMisfitEnum;
    11281129              else if (strcmp(name,"SurfaceSlopeX")==0) return SurfaceSlopeXEnum;
     
    12431244              else if (strcmp(name,"Outputdefinition6")==0) return Outputdefinition6Enum;
    12441245              else if (strcmp(name,"Outputdefinition70")==0) return Outputdefinition70Enum;
    1245               else if (strcmp(name,"Outputdefinition71")==0) return Outputdefinition71Enum;
    12461246         else stage=11;
    12471247   }
    12481248   if(stage==11){
    1249               if (strcmp(name,"Outputdefinition72")==0) return Outputdefinition72Enum;
     1249              if (strcmp(name,"Outputdefinition71")==0) return Outputdefinition71Enum;
     1250              else if (strcmp(name,"Outputdefinition72")==0) return Outputdefinition72Enum;
    12501251              else if (strcmp(name,"Outputdefinition73")==0) return Outputdefinition73Enum;
    12511252              else if (strcmp(name,"Outputdefinition74")==0) return Outputdefinition74Enum;
     
    13661367              else if (strcmp(name,"ElementSId")==0) return ElementSIdEnum;
    13671368              else if (strcmp(name,"EnthalpyAnalysis")==0) return EnthalpyAnalysisEnum;
    1368               else if (strcmp(name,"EsaAnalysis")==0) return EsaAnalysisEnum;
    13691369         else stage=12;
    13701370   }
    13711371   if(stage==12){
    1372               if (strcmp(name,"EsaSolution")==0) return EsaSolutionEnum;
     1372              if (strcmp(name,"EsaAnalysis")==0) return EsaAnalysisEnum;
     1373              else if (strcmp(name,"EsaSolution")==0) return EsaSolutionEnum;
    13731374              else if (strcmp(name,"EsaTransitions")==0) return EsaTransitionsEnum;
    13741375              else if (strcmp(name,"ExternalResult")==0) return ExternalResultEnum;
     
    14891490              else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
    14901491              else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
    1491               else if (strcmp(name,"Matdamageice")==0) return MatdamageiceEnum;
    14921492         else stage=13;
    14931493   }
    14941494   if(stage==13){
    1495               if (strcmp(name,"Matenhancedice")==0) return MatenhancediceEnum;
     1495              if (strcmp(name,"Matdamageice")==0) return MatdamageiceEnum;
     1496              else if (strcmp(name,"Matenhancedice")==0) return MatenhancediceEnum;
    14961497              else if (strcmp(name,"Materials")==0) return MaterialsEnum;
    14971498              else if (strcmp(name,"Matestar")==0) return MatestarEnum;
     
    16121613              else if (strcmp(name,"SpatialLinearFloatingMeltRate")==0) return SpatialLinearFloatingMeltRateEnum;
    16131614              else if (strcmp(name,"SpcDynamic")==0) return SpcDynamicEnum;
    1614               else if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
    16151615         else stage=14;
    16161616   }
    16171617   if(stage==14){
    1618               if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
     1618              if (strcmp(name,"SpcStatic")==0) return SpcStaticEnum;
     1619              else if (strcmp(name,"SpcTransient")==0) return SpcTransientEnum;
    16191620              else if (strcmp(name,"Sset")==0) return SsetEnum;
    16201621              else if (strcmp(name,"StatisticsSolution")==0) return StatisticsSolutionEnum;
  • issm/trunk-jpl/src/m/classes/basalforcingsbeckmanngoosse.m

    r25777 r27278  
    1111                ocean_temp                = 0.;
    1212                ocean_salinity            = NaN;
     13                ocean_thermalforcing      = NaN;
     14                isthermalforcing          = 0;
    1315        end
    1416        methods
     
    2022                        fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="ocean_temp" type="',class(self.ocean_temp),'" default="',num2str(self.ocean_temp),'">','     <section name="basalforcings" />','     <help> ocean_temp [degC] </help>','</parameter>');
    2123                        fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="ocean_salinity" type="',class(self.ocean_salinity),'" default="',num2str(self.ocean_salinity),'">','     <section name="basalforcings" />','     <help> ocean_salinity [psu] </help>','</parameter>');
     24                        fprintf(fid,'%s%s%s%s%s\n%s\n%s\n%s\n','<parameter key ="ocean_thermalforcing" type="',class(self.ocean_thermalforcing),'" default="',num2str(self.ocean_thermalforcing),'">','     <section name="basalforcings" />','     <help> ocean_thermalforcing [K] </help>','</parameter>');
    2225                end % }}}
    2326                function self = extrude(self,md) % {{{
     
    6063                function md = checkconsistency(self,md,solution,analyses) % {{{
    6164
     65                        if(self.isthermalforcing==0)
     66                                if(any(~isnan(self.ocean_thermalforcing)))
     67                                        error('basalforcingsbeckmanngoosse has isthermalforcing=0 but has specified entries for ocean_thermalforcing (should be unused)');
     68                                end
     69                        elseif(self.isthermalforcing==1)
     70                                if(any(self.ocean_temp~=0) || any(~isnan(self.ocean_salinity)))
     71                                        error('basalforcingsbeckmanngoosse has isthermalforcing=1 but has specified entries for ocean_temp or ocean_salinity (should be unused)');
     72                                end
     73                                if(strcmp(class(md.frontalforcings),'frontalforcingsrignot') && ~isequal(md.frontalforcings.thermalforcing,self.ocean_thermalforcing))
     74                                        error('basalforcing.ocean_thermalforcing is not consistent with frontalforcings.thermalforcing')
     75                                end
     76                                if(strcmp(class(md.frontalforcings),'frontalforcingsrignotarma') && any(~isnan(self.ocean_thermalforcing)))
     77                                        error('basalforcings has specified entries for ocean_thermalforcing, but frontalforcingsrignotarma already calculates thermalforcing internally')
     78                                end
     79                        end
     80
     81
    6282                        if ismember('MasstransportAnalysis',analyses) & ~(solution=='TransientSolution' & md.transient.ismasstransport==0),
    6383                                md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'Inf',1,'timeseries',1);
    64                                 md = checkfield(md,'fieldname','basalforcings.ocean_temp','NaN',1,'Inf',1,'timeseries',1);
    65                                 md = checkfield(md,'fieldname','basalforcings.ocean_salinity','NaN',1,'Inf',1,'timeseries',1); 
    6684                                md = checkfield(md,'fieldname','basalforcings.meltrate_factor','>=',0,'universal',1,'NaN',1,'Inf',1);
     85                                md = checkfield(md,'fieldname','basalforcings.isthermalforcing','values',[0 1]);
     86                                if(self.isthermalforcing==0)
     87                                        md = checkfield(md,'fieldname','basalforcings.ocean_temp','NaN',1,'Inf',1,'timeseries',1);
     88                                        md = checkfield(md,'fieldname','basalforcings.ocean_salinity','NaN',1,'Inf',1,'timeseries',1); 
     89                                elseif(self.isthermalforcing==1 && ~strcmp(class(md.frontalforcings),'frontalforcingsrignotarma'))
     90                                        md = checkfield(md,'fieldname','basalforcings.ocean_thermalforcing','NaN',1,'Inf',1,'timeseries',1);   
     91                                end
    6792                        end
    6893                        if ismember('BalancethicknessAnalysis',analyses),
    6994                                md = checkfield(md,'fieldname','basalforcings.groundedice_melting_rate','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices 1]);
    70                                 md = checkfield(md,'fieldname','basalforcings.ocean_temp','NaN',1,'Inf',1,'timeseries',1);
    71                                 md = checkfield(md,'fieldname','basalforcings.ocean_salinity','NaN',1,'Inf',1,'timeseries',1);
    7295                                md = checkfield(md,'fieldname','basalforcings.meltrate_factor','>=',0,'universal',1,'NaN',1,'Inf',1);
     96                                md = checkfield(md,'fieldname','basalforcings.isthermalforcing','values',[0 1]);
     97                                if(self.isthermalforcing==0)
     98                                        md = checkfield(md,'fieldname','basalforcings.ocean_temp','NaN',1,'Inf',1,'timeseries',1);
     99                                        md = checkfield(md,'fieldname','basalforcings.ocean_salinity','NaN',1,'Inf',1,'timeseries',1); 
     100                                elseif(self.isthermalforcing==1 && ~strcmp(class(md.frontalforcings),'frontalforcingsrignotarma'))
     101                                        md = checkfield(md,'fieldname','basalforcings.ocean_thermalforcing','NaN',1,'Inf',1,'timeseries',1);   
     102                                end
    73103                        end
    74104                        if ismember('ThermalAnalysis',analyses) & ~(solution=='TransientSolution' & md.transient.isthermal==0),
     
    84114                        fielddisplay(self,'geothermalflux','geothermal heat flux (W/m^2)');
    85115                        fielddisplay(self,'meltrate_factor','Melt-rate rate factor');
     116                        fielddisplay(self,'isthermalforcing','whether to use ocean_temp and ocean_salinity (0) or ocean_thermalforcing (1) (default:0)');
    86117                        fielddisplay(self,'ocean_temp','ocean temperature (degC)');
    87                         fielddisplay(self,'ocean_salinity','ocean ocean_salinity (psu)');
     118                        fielddisplay(self,'ocean_salinity','ocean salinity (psu)');
     119                        fielddisplay(self,'ocean_thermalforcing','ocean thermalforcing (K)');
    88120
    89121                end % }}}
     
    99131
    100132                        WriteData(fid,prefix,'name','md.basalforcings.model','data',8,'format','Integer');
    101                         WriteData(fid,prefix,'data',floatingice_melting_rate,'format','DoubleMat','name','md.basalforcings.floatingice_melting_rate','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
    102133                        WriteData(fid,prefix,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','name','md.basalforcings.groundedice_melting_rate','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1)
    103134                        WriteData(fid,prefix,'object',self,'fieldname','geothermalflux','name','md.basalforcings.geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
    104135                        WriteData(fid,prefix,'object',self,'fieldname','meltrate_factor','format','DoubleMat','mattype',1,'name','md.basalforcings.meltrate_factor');
    105                         WriteData(fid,prefix,'object',self,'fieldname','ocean_temp','format','DoubleMat','name','md.basalforcings.ocean_temp','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
    106                         WriteData(fid,prefix,'object',self,'fieldname','ocean_salinity','format','DoubleMat','name','md.basalforcings.ocean_salinity','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
    107 
     136                        WriteData(fid,prefix,'object',self,'fieldname','isthermalforcing','format','Boolean');
     137                        if(self.isthermalforcing==0)
     138                                WriteData(fid,prefix,'object',self,'fieldname','ocean_temp','format','DoubleMat','name','md.basalforcings.ocean_temp','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
     139                                WriteData(fid,prefix,'object',self,'fieldname','ocean_salinity','format','DoubleMat','name','md.basalforcings.ocean_salinity','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
     140                        elseif(self.isthermalforcing==1)
     141                                WriteData(fid,prefix,'object',self,'fieldname','ocean_thermalforcing','format','DoubleMat','name','md.basalforcings.ocean_thermalforcing','mattype',1,'timeserieslength',md.mesh.numberofvertices+1);
     142                        end
    108143                end % }}}
    109144        end
Note: See TracChangeset for help on using the changeset viewer.