Changeset 26477
- Timestamp:
- 10/13/21 07:11:29 (3 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 4 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/Makefile.am
r26476 r26477 187 187 ./shared/Elements/DrainageFunctionWaterfraction.cpp \ 188 188 ./shared/Elements/EstarComponents.cpp \ 189 ./shared/Random/random.cpp \ 189 190 ./shared/String/DescriptorIndex.cpp \ 190 191 ./toolkits/issm/IssmToolkitUtils.cpp \ -
issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp
r26468 r26477 179 179 iomodel->FetchDataToInput(inputs,elements,"md.smb.b_min",SmbBMinEnum); 180 180 break; 181 case SMBautoregressionEnum: 182 iomodel->FetchDataToInput(inputs,elements,"md.smb.basin_id",SmbBasinsIdEnum); 183 break; 181 184 case SMBhenningEnum: 182 185 iomodel->FetchDataToInput(inputs,elements,"md.smb.smbref",SmbSmbrefEnum,0.); … … 375 378 /*Nothing to add to parameters*/ 376 379 break; 380 case SMBautoregressionEnum: 381 /*Nothing to add to parameters*/ 382 break; 377 383 case SMBhenningEnum: 378 384 /*Nothing to add to parameters*/ … … 467 473 SmbGradientsElax(femmodel); 468 474 break; 475 case SMBautoregressionEnum: 476 if(VerboseSolution())_printf0_(" call smb autoregression module\n"); 477 Smbautoregressionx(femmodel); 478 break; 469 479 case SMBhenningEnum: 470 480 if(VerboseSolution())_printf0_(" call smb Henning module\n"); -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r26468 r26477 3574 3574 } 3575 3575 /*}}}*/ 3576 void Element::SmbautoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noisespin){/*{{{*/ 3577 const int numvertices = this->GetNumberOfVertices(); 3578 int basinid; 3579 IssmDouble tspin,beta0_basin,beta1_basin,noisespin_basin; //initialize scalars 3580 IssmDouble* phi_basin = xNew<IssmDouble>(arorder); 3581 IssmDouble* smbspin = xNew<IssmDouble>(numvertices*arorder); 3582 this->GetInputValue(&basinid,SmbBasinsIdEnum); 3583 for(int ii{0};ii<arorder;ii++){phi_basin[ii] = phi[basinid*arorder+ii];} 3584 beta0_basin = beta0[basinid]; 3585 beta1_basin = beta1[basinid]; 3586 for(int jj{0};jj<nspin;jj++){ 3587 tspin = starttime-((nspin-jj)*tstep_ar); //current time in spin-up loop 3588 noisespin_basin = noisespin[jj*numbasins+basinid]; 3589 IssmDouble* oldsmbspin = xNewZeroInit<IssmDouble>(numvertices*arorder); 3590 for(int ii{0};ii<numvertices*arorder;ii++){oldsmbspin[ii]=smbspin[ii];} //copy smbspin in oldsmbspin 3591 for(int v=0;v<numvertices;v++){ 3592 double autoregressionterm{0.0}; 3593 for(int ii{0};ii<arorder;ii++){autoregressionterm += phi_basin[ii]*smbspin[v+ii*numvertices];} 3594 smbspin[v] = beta0_basin+beta1_basin*(tspin-tinit_ar)+autoregressionterm+noisespin_basin; //compute newest values in smbspin 3595 } 3596 for(int ii{0};ii<(arorder-1)*numvertices;ii++){smbspin[ii+numvertices]=oldsmbspin[ii];} //correct older values in smbspin 3597 xDelete<IssmDouble>(oldsmbspin); //cleanup 3598 } 3599 this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,smbspin,numvertices*arorder);//save spin-up autoregression values 3600 xDelete<IssmDouble>(smbspin); //cleanup 3601 xDelete<IssmDouble>(phi_basin); //cleanup 3602 }/*}}}*/ 3603 void Element::Smbautoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms){/*{{{*/ 3604 const int numvertices = this->GetNumberOfVertices(); 3605 int basinid,M,N; 3606 IssmDouble beta0_basin,beta1_basin,noise_basin; //initialize scalars 3607 IssmDouble* phi_basin = xNew<IssmDouble>(arorder); 3608 IssmDouble* smblist = xNew<IssmDouble>(numvertices); 3609 IssmDouble* smbvaluesautoregression = NULL; //array for past SMB values that we are about to retrieve 3610 this->GetInputValue(&basinid,SmbBasinsIdEnum); 3611 for(int ii{0};ii<arorder;ii++){phi_basin[ii] = phi[basinid*arorder+ii];} 3612 beta0_basin = beta0[basinid]; 3613 beta1_basin = beta1[basinid]; 3614 noise_basin = noiseterms[basinid]; //note that noiseterms is computed at every timestep 3615 this->inputs->GetArray(SmbValuesAutoregressionEnum,this->lid,&smbvaluesautoregression,&M); //get array of past SMB values to compute AR model 3616 /*If not AR model timestep: take the old SMB values*/ 3617 if(isstepforar==false){ 3618 //VV do something with the lapse rate here if needed (12Oct2021) 3619 for(int ii{0};ii<numvertices;ii++){smblist[ii]=smbvaluesautoregression[ii];} 3620 } 3621 /*If AR model timestep: compute SMB values on vertices from AR*/ 3622 else{ 3623 for(int v=0;v<numvertices;v++){ 3624 double autoregressionterm{0.0}; 3625 for(int ii{0};ii<arorder;ii++){autoregressionterm += phi_basin[ii]*smbvaluesautoregression[v+ii*numvertices];} //compute autoregressive term 3626 smblist[v] = beta0_basin+beta1_basin*telapsed_ar+autoregressionterm+noise_basin; //stochastic SMB value 3627 } 3628 /*Update autoregression smb values*/ 3629 IssmDouble* temparray = xNew<IssmDouble>(numvertices*arorder); 3630 for(int ii{0};ii<numvertices;ii++){temparray[ii] = smblist[ii];} //first store newly computed smb values 3631 for(int ii{0};ii<(arorder-1)*numvertices;ii++){temparray[ii+numvertices] = smbvaluesautoregression[ii];} //second shift older smb values 3632 this->inputs->SetArrayInput(SmbValuesAutoregressionEnum,this->lid,temparray,numvertices*arorder); //save updated autoregression values 3633 xDelete<IssmDouble>(temparray); //cleanup 3634 } 3635 /*Add input to element*/ 3636 this->AddInput(SmbMassBalanceEnum,smblist,P1Enum); 3637 /*Cleanup*/ 3638 xDelete<IssmDouble>(phi_basin); 3639 xDelete<IssmDouble>(smblist); 3640 xDelete<IssmDouble>(smbvaluesautoregression); 3641 }/*}}}*/ 3576 3642 void Element::SmbGemb(IssmDouble timeinputs, int count){/*{{{*/ 3577 3643 -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r26469 r26477 176 176 void SmbSemic(); 177 177 int Sid(); 178 void SmbautoregressionInit(int numbasins,int arorder,int nspin,IssmDouble starttime,IssmDouble tstep_ar,IssmDouble tinit_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noisespin); 179 void Smbautoregression(bool isstepforar,int arorder,IssmDouble telapsed_ar,IssmDouble* beta0,IssmDouble* beta1,IssmDouble* phi,IssmDouble* noiseterms); 178 180 void SmbGemb(IssmDouble timeinputs, int count); 179 181 void StrainRateESA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input); -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r26468 r26477 396 396 /*Nothing to add*/ 397 397 break; 398 case SMBautoregressionEnum: 399 /*Add parameters that are not in standard nbvertices format*/ 400 parameters->AddObject(iomodel->CopyConstantObject("md.smb.num_basins",SmbNumBasinsEnum)); 401 parameters->AddObject(iomodel->CopyConstantObject("md.smb.ar_order",SmbAutoregressiveOrderEnum)); 402 parameters->AddObject(iomodel->CopyConstantObject("md.smb.ar_initialtime",SmbAutoregressionInitialTimeEnum)); 403 parameters->AddObject(iomodel->CopyConstantObject("md.smb.ar_timestep",SmbAutoregressionTimestepEnum)); 404 iomodel->FetchData(&transparam,&M,&N,"md.smb.beta0"); 405 parameters->AddObject(new DoubleVecParam(SmbBeta0Enum,transparam,N)); 406 xDelete<IssmDouble>(transparam); 407 iomodel->FetchData(&transparam,&M,&N,"md.smb.beta1"); 408 parameters->AddObject(new DoubleVecParam(SmbBeta1Enum,transparam,N)); 409 xDelete<IssmDouble>(transparam); 410 iomodel->FetchData(&transparam,&M,&N,"md.smb.phi"); 411 parameters->AddObject(new DoubleMatParam(SmbPhiEnum,transparam,M,N)); 412 xDelete<IssmDouble>(transparam); 413 iomodel->FetchData(&transparam,&M,&N,"md.smb.covmat"); 414 parameters->AddObject(new DoubleMatParam(SmbCovmatEnum,transparam,M,N)); 415 xDelete<IssmDouble>(transparam); 416 break; 398 417 case SMBgembEnum: 399 418 parameters->AddObject(iomodel->CopyConstantObject("md.smb.aIce",SmbAIceEnum)); -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
r26208 r26477 8 8 #include "../modules.h" 9 9 #include "../../classes/Inputs/TransientInput.h" 10 #include "../../shared/Random/random.h" 10 11 11 12 void SmbForcingx(FemModel* femmodel){/*{{{*/ … … 144 145 } 145 146 147 }/*}}}*/ 148 void SmbautoregressionInitx(FemModel* femmodel){/*{{{*/ 149 /*Initialization step of Smbautoregressionx*/ 150 int M,N,Nphi,arorder,numbasins; 151 IssmDouble starttime,tstep_ar,tinit_ar; 152 IssmDouble* beta0 = xNew<IssmDouble>(numbasins); 153 IssmDouble* beta1 = xNew<IssmDouble>(numbasins); 154 IssmDouble* phi = xNew<IssmDouble>(numbasins*arorder); 155 IssmDouble* covmat = xNew<IssmDouble>(numbasins*numbasins); 156 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum); 157 femmodel->parameters->FindParam(&tstep_ar,SmbAutoregressionTimestepEnum); 158 femmodel->parameters->FindParam(&tinit_ar,SmbAutoregressionInitialTimeEnum); 159 femmodel->parameters->FindParam(&numbasins,SmbNumBasinsEnum); 160 femmodel->parameters->FindParam(&arorder,SmbAutoregressiveOrderEnum); 161 femmodel->parameters->FindParam(&beta0,&M,SmbBeta0Enum); _assert_(M==numbasins); 162 femmodel->parameters->FindParam(&beta1,&M,SmbBeta1Enum); _assert_(M==numbasins); 163 femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum); _assert_(M==numbasins); _assert_(Nphi==arorder); 164 femmodel->parameters->FindParam(&covmat,&M,&N,SmbCovmatEnum); _assert_(M==numbasins); _assert_(N==numbasins); 165 /*AR model spin-up*/ 166 int nspin{2*arorder+5}; //number of spin-up steps to be executed 167 IssmDouble* noisespin = xNewZeroInit<IssmDouble>(numbasins*nspin); //sample of basin-specific noise at each spinup step 168 for(int ii{0};ii<nspin;ii++){ 169 IssmDouble* temparray = xNew<IssmDouble>(numbasins); 170 multivariateNormal(&temparray,numbasins,0.0,covmat); 171 for(int jj{0};jj<numbasins;jj++){noisespin[ii*numbasins+jj]=temparray[jj];} 172 xDelete<IssmDouble>(temparray); 173 } 174 /*Initialize SmbValuesAutoregressionEnum*/ 175 for(Object* &object:femmodel->elements->objects){ 176 Element* element = xDynamicCast<Element*>(object); //generate element object 177 element->SmbautoregressionInit(numbasins,arorder,nspin,starttime,tstep_ar,tinit_ar,beta0,beta1,phi,noisespin); 178 } 179 /*Cleanup*/ 180 xDelete<IssmDouble>(beta0); 181 xDelete<IssmDouble>(beta1); 182 xDelete<IssmDouble>(phi); 183 xDelete<IssmDouble>(noisespin); 184 xDelete<IssmDouble>(covmat); 185 }/*}}}*/ 186 void Smbautoregressionx(FemModel* femmodel){/*{{{*/ 187 /*Get time parameters*/ 188 IssmDouble time,dt,starttime,tstep_ar; 189 femmodel->parameters->FindParam(&time,TimeEnum); 190 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 191 femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum); 192 femmodel->parameters->FindParam(&tstep_ar,SmbAutoregressionTimestepEnum); 193 /*Initialize module at first time step*/ 194 if(time<=starttime+dt){SmbautoregressionInitx(femmodel);} 195 /*Determine if this is a time step for the AR model*/ 196 bool isstepforar{false}; 197 if((std::fmod(time,tstep_ar)<std::fmod((time-dt),tstep_ar)) || (time<=starttime+dt) || tstep_ar==dt){isstepforar = true;} 198 /*Load parameters*/ 199 int M,N,Nphi,arorder,numbasins; 200 femmodel->parameters->FindParam(&numbasins,SmbNumBasinsEnum); 201 femmodel->parameters->FindParam(&arorder,SmbAutoregressiveOrderEnum); 202 IssmDouble tinit_ar; 203 IssmDouble* beta0 = xNew<IssmDouble>(numbasins); 204 IssmDouble* beta1 = xNew<IssmDouble>(numbasins); 205 IssmDouble* phi = xNew<IssmDouble>(numbasins*arorder); 206 IssmDouble* noiseterms = xNew<IssmDouble>(numbasins); 207 IssmDouble* covmat = xNew<IssmDouble>(numbasins*numbasins); 208 femmodel->parameters->FindParam(&tinit_ar,SmbAutoregressionInitialTimeEnum); 209 femmodel->parameters->FindParam(&beta0,&M,SmbBeta0Enum); _assert_(M==numbasins); 210 femmodel->parameters->FindParam(&beta1,&M,SmbBeta1Enum); _assert_(M==numbasins); 211 femmodel->parameters->FindParam(&phi,&M,&Nphi,SmbPhiEnum); _assert_(M==numbasins); _assert_(Nphi==arorder); 212 femmodel->parameters->FindParam(&covmat,&M,&N,SmbCovmatEnum); _assert_(M==numbasins); _assert_(N==numbasins); 213 IssmDouble telapsed_ar = time-tinit_ar; //time elapsed with respect to AR model initial time 214 /*Before looping through elements: compute noise term specific to each basin from covmat*/ 215 multivariateNormal(&noiseterms,numbasins,0.0,covmat); 216 /*Loop over each element to compute SMB at vertices*/ 217 for(Object* &object:femmodel->elements->objects){ 218 Element* element = xDynamicCast<Element*>(object); //generate element object 219 element->Smbautoregression(isstepforar,arorder,telapsed_ar,beta0,beta1,phi,noiseterms); 220 } 221 /*Cleanup*/ 222 xDelete<IssmDouble>(beta0); 223 xDelete<IssmDouble>(beta1); 224 xDelete<IssmDouble>(phi); 225 xDelete<IssmDouble>(noiseterms); 226 xDelete<IssmDouble>(covmat); 146 227 }/*}}}*/ 147 228 void Delta18oParameterizationx(FemModel* femmodel){/*{{{*/ -
issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h
r26271 r26477 13 13 void SmbGradientsx(FemModel* femmodel); 14 14 void SmbGradientsElax(FemModel* femmodel); 15 void SmbautoregressionInitx(FemModel* femmodel); 16 void Smbautoregressionx(FemModel* femmodel); 15 17 void Delta18oParameterizationx(FemModel* femmodel); 16 18 void MungsmtpParameterizationx(FemModel* femmodel); -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r26457 r26477 409 409 SmbAccurefEnum, 410 410 SmbAdThreshEnum, 411 SmbAutoregressionInitialTimeEnum, 412 SmbAutoregressionTimestepEnum, 413 SmbAutoregressiveOrderEnum, 411 414 SmbAveragingEnum, 415 SmbBeta0Enum, 416 SmbBeta1Enum, 417 SmbCovmatEnum, 412 418 SmbDesfacEnum, 413 419 SmbDpermilEnum, … … 438 444 SmbIsturbulentfluxEnum, 439 445 SmbKEnum, 446 SmbNumBasinsEnum, 440 447 SmbNumRequestedOutputsEnum, 441 448 SmbPfacEnum, 449 SmbPhiEnum, 442 450 SmbRdlEnum, 443 451 SmbRequestedOutputsEnum, … … 863 871 SmbAdiffiniEnum, 864 872 SmbAiniEnum, 873 SmbBasinsIdEnum, 865 874 SmbBMaxEnum, 866 875 SmbBMinEnum, … … 949 958 SmbTmeanEnum, 950 959 SmbTzEnum, 960 SmbValuesAutoregressionEnum, 951 961 SmbVEnum, 952 962 SmbVmeanEnum, … … 1414 1424 SamplingSolutionEnum, 1415 1425 SIAApproximationEnum, 1426 SMBautoregressionEnum, 1416 1427 SMBcomponentsEnum, 1417 1428 SMBd18opddEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r26445 r26477 417 417 case SmbAccurefEnum : return "SmbAccuref"; 418 418 case SmbAdThreshEnum : return "SmbAdThresh"; 419 case SmbAutoregressionInitialTimeEnum : return "SmbAutoregressionInitialTime"; 420 case SmbAutoregressionTimestepEnum : return "SmbAutoregressionTimestep"; 421 case SmbAutoregressiveOrderEnum : return "SmbAutoregressiveOrder"; 419 422 case SmbAveragingEnum : return "SmbAveraging"; 423 case SmbBeta0Enum : return "SmbBeta0"; 424 case SmbBeta1Enum : return "SmbBeta1"; 425 case SmbCovmatEnum : return "SmbCovmat"; 420 426 case SmbDesfacEnum : return "SmbDesfac"; 421 427 case SmbDpermilEnum : return "SmbDpermil"; … … 446 452 case SmbIsturbulentfluxEnum : return "SmbIsturbulentflux"; 447 453 case SmbKEnum : return "SmbK"; 454 case SmbNumBasinsEnum : return "SmbNumBasins"; 448 455 case SmbNumRequestedOutputsEnum : return "SmbNumRequestedOutputs"; 449 456 case SmbPfacEnum : return "SmbPfac"; 457 case SmbPhiEnum : return "SmbPhi"; 450 458 case SmbRdlEnum : return "SmbRdl"; 451 459 case SmbRequestedOutputsEnum : return "SmbRequestedOutputs"; … … 542 550 case AdjointpEnum : return "Adjointp"; 543 551 case AdjointxEnum : return "Adjointx"; 552 case AdjointxBaseEnum : return "AdjointxBase"; 553 case AdjointxShearEnum : return "AdjointxShear"; 544 554 case AdjointyEnum : return "Adjointy"; 555 case AdjointyBaseEnum : return "AdjointyBase"; 556 case AdjointyShearEnum : return "AdjointyShear"; 545 557 case AdjointzEnum : return "Adjointz"; 546 558 case AirEnum : return "Air"; … … 865 877 case SmbAdiffiniEnum : return "SmbAdiffini"; 866 878 case SmbAiniEnum : return "SmbAini"; 879 case SmbBasinsIdEnum : return "SmbBasinsId"; 867 880 case SmbBMaxEnum : return "SmbBMax"; 868 881 case SmbBMinEnum : return "SmbBMin"; … … 950 963 case SmbTmeanEnum : return "SmbTmean"; 951 964 case SmbTzEnum : return "SmbTz"; 965 case SmbValuesAutoregressionEnum : return "SmbValuesAutoregression"; 952 966 case SmbVEnum : return "SmbV"; 953 967 case SmbVmeanEnum : return "SmbVmean"; … … 1413 1427 case SamplingSolutionEnum : return "SamplingSolution"; 1414 1428 case SIAApproximationEnum : return "SIAApproximation"; 1429 case SMBautoregressionEnum : return "SMBautoregression"; 1415 1430 case SMBcomponentsEnum : return "SMBcomponents"; 1416 1431 case SMBd18opddEnum : return "SMBd18opdd"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r26445 r26477 426 426 else if (strcmp(name,"SmbAccuref")==0) return SmbAccurefEnum; 427 427 else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum; 428 else if (strcmp(name,"SmbAutoregressionInitialTime")==0) return SmbAutoregressionInitialTimeEnum; 429 else if (strcmp(name,"SmbAutoregressionTimestep")==0) return SmbAutoregressionTimestepEnum; 430 else if (strcmp(name,"SmbAutoregressiveOrder")==0) return SmbAutoregressiveOrderEnum; 428 431 else if (strcmp(name,"SmbAveraging")==0) return SmbAveragingEnum; 432 else if (strcmp(name,"SmbBeta0")==0) return SmbBeta0Enum; 433 else if (strcmp(name,"SmbBeta1")==0) return SmbBeta1Enum; 434 else if (strcmp(name,"SmbCovmat")==0) return SmbCovmatEnum; 429 435 else if (strcmp(name,"SmbDesfac")==0) return SmbDesfacEnum; 430 436 else if (strcmp(name,"SmbDpermil")==0) return SmbDpermilEnum; … … 455 461 else if (strcmp(name,"SmbIsturbulentflux")==0) return SmbIsturbulentfluxEnum; 456 462 else if (strcmp(name,"SmbK")==0) return SmbKEnum; 463 else if (strcmp(name,"SmbNumBasins")==0) return SmbNumBasinsEnum; 457 464 else if (strcmp(name,"SmbNumRequestedOutputs")==0) return SmbNumRequestedOutputsEnum; 458 465 else if (strcmp(name,"SmbPfac")==0) return SmbPfacEnum; 466 else if (strcmp(name,"SmbPhi")==0) return SmbPhiEnum; 459 467 else if (strcmp(name,"SmbRdl")==0) return SmbRdlEnum; 460 468 else if (strcmp(name,"SmbRequestedOutputs")==0) return SmbRequestedOutputsEnum; … … 498 506 else if (strcmp(name,"ThermalNumRequestedOutputs")==0) return ThermalNumRequestedOutputsEnum; 499 507 else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum; 500 else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum; 508 else stage=5; 509 } 510 if(stage==5){ 511 if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum; 501 512 else if (strcmp(name,"ThermalPenaltyThreshold")==0) return ThermalPenaltyThresholdEnum; 502 513 else if (strcmp(name,"ThermalReltol")==0) return ThermalReltolEnum; … … 506 517 else if (strcmp(name,"Time")==0) return TimeEnum; 507 518 else if (strcmp(name,"TimesteppingCflCoefficient")==0) return TimesteppingCflCoefficientEnum; 508 else stage=5; 509 } 510 if(stage==5){ 511 if (strcmp(name,"TimesteppingCouplingTime")==0) return TimesteppingCouplingTimeEnum; 519 else if (strcmp(name,"TimesteppingCouplingTime")==0) return TimesteppingCouplingTimeEnum; 512 520 else if (strcmp(name,"TimesteppingFinalTime")==0) return TimesteppingFinalTimeEnum; 513 521 else if (strcmp(name,"TimesteppingInterpForcing")==0) return TimesteppingInterpForcingEnum; … … 554 562 else if (strcmp(name,"Adjointp")==0) return AdjointpEnum; 555 563 else if (strcmp(name,"Adjointx")==0) return AdjointxEnum; 564 else if (strcmp(name,"AdjointxBase")==0) return AdjointxBaseEnum; 565 else if (strcmp(name,"AdjointxShear")==0) return AdjointxShearEnum; 556 566 else if (strcmp(name,"Adjointy")==0) return AdjointyEnum; 567 else if (strcmp(name,"AdjointyBase")==0) return AdjointyBaseEnum; 568 else if (strcmp(name,"AdjointyShear")==0) return AdjointyShearEnum; 557 569 else if (strcmp(name,"Adjointz")==0) return AdjointzEnum; 558 570 else if (strcmp(name,"Air")==0) return AirEnum; … … 617 629 else if (strcmp(name,"DamageDbarOld")==0) return DamageDbarOldEnum; 618 630 else if (strcmp(name,"DamageF")==0) return DamageFEnum; 619 else if (strcmp(name,"DegreeOfChannelization")==0) return DegreeOfChannelizationEnum; 631 else stage=6; 632 } 633 if(stage==6){ 634 if (strcmp(name,"DegreeOfChannelization")==0) return DegreeOfChannelizationEnum; 620 635 else if (strcmp(name,"DepthBelowSurface")==0) return DepthBelowSurfaceEnum; 621 636 else if (strcmp(name,"DeltaIceThickness")==0) return DeltaIceThicknessEnum; … … 629 644 else if (strcmp(name,"Str")==0) return StrEnum; 630 645 else if (strcmp(name,"DeviatoricStresseffective")==0) return DeviatoricStresseffectiveEnum; 631 else stage=6; 632 } 633 if(stage==6){ 634 if (strcmp(name,"DeviatoricStressxx")==0) return DeviatoricStressxxEnum; 646 else if (strcmp(name,"DeviatoricStressxx")==0) return DeviatoricStressxxEnum; 635 647 else if (strcmp(name,"DeviatoricStressxy")==0) return DeviatoricStressxyEnum; 636 648 else if (strcmp(name,"DeviatoricStressxz")==0) return DeviatoricStressxzEnum; … … 740 752 else if (strcmp(name,"LevelsetObservation")==0) return LevelsetObservationEnum; 741 753 else if (strcmp(name,"LoadingforceX")==0) return LoadingforceXEnum; 742 else if (strcmp(name,"LoadingforceY")==0) return LoadingforceYEnum; 754 else stage=7; 755 } 756 if(stage==7){ 757 if (strcmp(name,"LoadingforceY")==0) return LoadingforceYEnum; 743 758 else if (strcmp(name,"LoadingforceZ")==0) return LoadingforceZEnum; 744 759 else if (strcmp(name,"MaskOceanLevelset")==0) return MaskOceanLevelsetEnum; … … 752 767 else if (strcmp(name,"MaterialsRheologyEc")==0) return MaterialsRheologyEcEnum; 753 768 else if (strcmp(name,"MaterialsRheologyEcbar")==0) return MaterialsRheologyEcbarEnum; 754 else stage=7; 755 } 756 if(stage==7){ 757 if (strcmp(name,"MaterialsRheologyEs")==0) return MaterialsRheologyEsEnum; 769 else if (strcmp(name,"MaterialsRheologyEs")==0) return MaterialsRheologyEsEnum; 758 770 else if (strcmp(name,"MaterialsRheologyEsbar")==0) return MaterialsRheologyEsbarEnum; 759 771 else if (strcmp(name,"MaterialsRheologyN")==0) return MaterialsRheologyNEnum; … … 863 875 else if (strcmp(name,"SealevelchangeViscousE")==0) return SealevelchangeViscousEEnum; 864 876 else if (strcmp(name,"SedimentHead")==0) return SedimentHeadEnum; 865 else if (strcmp(name,"SedimentHeadOld")==0) return SedimentHeadOldEnum; 877 else stage=8; 878 } 879 if(stage==8){ 880 if (strcmp(name,"SedimentHeadOld")==0) return SedimentHeadOldEnum; 866 881 else if (strcmp(name,"SedimentHeadSubstep")==0) return SedimentHeadSubstepEnum; 867 882 else if (strcmp(name,"SedimentHeadTransient")==0) return SedimentHeadTransientEnum; … … 875 890 else if (strcmp(name,"SmbAccumulatedPrecipitation")==0) return SmbAccumulatedPrecipitationEnum; 876 891 else if (strcmp(name,"SmbAccumulatedRain")==0) return SmbAccumulatedRainEnum; 877 else stage=8; 878 } 879 if(stage==8){ 880 if (strcmp(name,"SmbAccumulatedRefreeze")==0) return SmbAccumulatedRefreezeEnum; 892 else if (strcmp(name,"SmbAccumulatedRefreeze")==0) return SmbAccumulatedRefreezeEnum; 881 893 else if (strcmp(name,"SmbAccumulatedRunoff")==0) return SmbAccumulatedRunoffEnum; 882 894 else if (strcmp(name,"SmbA")==0) return SmbAEnum; … … 886 898 else if (strcmp(name,"SmbAdiffini")==0) return SmbAdiffiniEnum; 887 899 else if (strcmp(name,"SmbAini")==0) return SmbAiniEnum; 900 else if (strcmp(name,"SmbBasinsId")==0) return SmbBasinsIdEnum; 888 901 else if (strcmp(name,"SmbBMax")==0) return SmbBMaxEnum; 889 902 else if (strcmp(name,"SmbBMin")==0) return SmbBMinEnum; … … 971 984 else if (strcmp(name,"SmbTmean")==0) return SmbTmeanEnum; 972 985 else if (strcmp(name,"SmbTz")==0) return SmbTzEnum; 986 else if (strcmp(name,"SmbValuesAutoregression")==0) return SmbValuesAutoregressionEnum; 973 987 else if (strcmp(name,"SmbV")==0) return SmbVEnum; 974 988 else if (strcmp(name,"SmbVmean")==0) return SmbVmeanEnum; … … 984 998 else if (strcmp(name,"SolidearthExternalDisplacementNorthRate")==0) return SolidearthExternalDisplacementNorthRateEnum; 985 999 else if (strcmp(name,"SolidearthExternalDisplacementUpRate")==0) return SolidearthExternalDisplacementUpRateEnum; 986 else if (strcmp(name,"SolidearthExternalGeoidRate")==0) return SolidearthExternalGeoidRateEnum; 1000 else stage=9; 1001 } 1002 if(stage==9){ 1003 if (strcmp(name,"SolidearthExternalGeoidRate")==0) return SolidearthExternalGeoidRateEnum; 987 1004 else if (strcmp(name,"StrainRateeffective")==0) return StrainRateeffectiveEnum; 988 1005 else if (strcmp(name,"StrainRateparallel")==0) return StrainRateparallelEnum; … … 998 1015 else if (strcmp(name,"StressTensorxy")==0) return StressTensorxyEnum; 999 1016 else if (strcmp(name,"StressTensorxz")==0) return StressTensorxzEnum; 1000 else stage=9; 1001 } 1002 if(stage==9){ 1003 if (strcmp(name,"StressTensoryy")==0) return StressTensoryyEnum; 1017 else if (strcmp(name,"StressTensoryy")==0) return StressTensoryyEnum; 1004 1018 else if (strcmp(name,"StressTensoryz")==0) return StressTensoryzEnum; 1005 1019 else if (strcmp(name,"StressTensorzz")==0) return StressTensorzzEnum; … … 1107 1121 else if (strcmp(name,"Outputdefinition48")==0) return Outputdefinition48Enum; 1108 1122 else if (strcmp(name,"Outputdefinition49")==0) return Outputdefinition49Enum; 1109 else if (strcmp(name,"Outputdefinition4")==0) return Outputdefinition4Enum; 1123 else stage=10; 1124 } 1125 if(stage==10){ 1126 if (strcmp(name,"Outputdefinition4")==0) return Outputdefinition4Enum; 1110 1127 else if (strcmp(name,"Outputdefinition50")==0) return Outputdefinition50Enum; 1111 1128 else if (strcmp(name,"Outputdefinition51")==0) return Outputdefinition51Enum; … … 1121 1138 else if (strcmp(name,"Outputdefinition60")==0) return Outputdefinition60Enum; 1122 1139 else if (strcmp(name,"Outputdefinition61")==0) return Outputdefinition61Enum; 1123 else stage=10; 1124 } 1125 if(stage==10){ 1126 if (strcmp(name,"Outputdefinition62")==0) return Outputdefinition62Enum; 1140 else if (strcmp(name,"Outputdefinition62")==0) return Outputdefinition62Enum; 1127 1141 else if (strcmp(name,"Outputdefinition63")==0) return Outputdefinition63Enum; 1128 1142 else if (strcmp(name,"Outputdefinition64")==0) return Outputdefinition64Enum; … … 1230 1244 else if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum; 1231 1245 else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum; 1232 else if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum; 1246 else stage=11; 1247 } 1248 if(stage==11){ 1249 if (strcmp(name,"DefaultAnalysis")==0) return DefaultAnalysisEnum; 1233 1250 else if (strcmp(name,"DefaultCalving")==0) return DefaultCalvingEnum; 1234 1251 else if (strcmp(name,"Dense")==0) return DenseEnum; … … 1244 1261 else if (strcmp(name,"DoubleMatExternalResult")==0) return DoubleMatExternalResultEnum; 1245 1262 else if (strcmp(name,"DoubleMatParam")==0) return DoubleMatParamEnum; 1246 else stage=11; 1247 } 1248 if(stage==11){ 1249 if (strcmp(name,"DoubleParam")==0) return DoubleParamEnum; 1263 else if (strcmp(name,"DoubleParam")==0) return DoubleParamEnum; 1250 1264 else if (strcmp(name,"DoubleVecParam")==0) return DoubleVecParamEnum; 1251 1265 else if (strcmp(name,"Element")==0) return ElementEnum; … … 1353 1367 else if (strcmp(name,"LoveLr")==0) return LoveLrEnum; 1354 1368 else if (strcmp(name,"LoveSolution")==0) return LoveSolutionEnum; 1355 else if (strcmp(name,"MINI")==0) return MINIEnum; 1369 else stage=12; 1370 } 1371 if(stage==12){ 1372 if (strcmp(name,"MINI")==0) return MINIEnum; 1356 1373 else if (strcmp(name,"MINIcondensed")==0) return MINIcondensedEnum; 1357 1374 else if (strcmp(name,"MantlePlumeGeothermalFlux")==0) return MantlePlumeGeothermalFluxEnum; … … 1367 1384 else if (strcmp(name,"Matestar")==0) return MatestarEnum; 1368 1385 else if (strcmp(name,"Matice")==0) return MaticeEnum; 1369 else stage=12; 1370 } 1371 if(stage==12){ 1372 if (strcmp(name,"Matlitho")==0) return MatlithoEnum; 1386 else if (strcmp(name,"Matlitho")==0) return MatlithoEnum; 1373 1387 else if (strcmp(name,"Mathydro")==0) return MathydroEnum; 1374 1388 else if (strcmp(name,"MatrixParam")==0) return MatrixParamEnum; … … 1446 1460 else if (strcmp(name,"SamplingSolution")==0) return SamplingSolutionEnum; 1447 1461 else if (strcmp(name,"SIAApproximation")==0) return SIAApproximationEnum; 1462 else if (strcmp(name,"SMBautoregression")==0) return SMBautoregressionEnum; 1448 1463 else if (strcmp(name,"SMBcomponents")==0) return SMBcomponentsEnum; 1449 1464 else if (strcmp(name,"SMBd18opdd")==0) return SMBd18opddEnum; … … 1475 1490 else if (strcmp(name,"SegInput")==0) return SegInputEnum; 1476 1491 else if (strcmp(name,"Segment")==0) return SegmentEnum; 1477 else if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum; 1492 else stage=13; 1493 } 1494 if(stage==13){ 1495 if (strcmp(name,"SegmentRiftfront")==0) return SegmentRiftfrontEnum; 1478 1496 else if (strcmp(name,"Separate")==0) return SeparateEnum; 1479 1497 else if (strcmp(name,"Seq")==0) return SeqEnum; … … 1490 1508 else if (strcmp(name,"SteadystateSolution")==0) return SteadystateSolutionEnum; 1491 1509 else if (strcmp(name,"StressIntensityFactor")==0) return StressIntensityFactorEnum; 1492 else stage=13; 1493 } 1494 if(stage==13){ 1495 if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum; 1510 else if (strcmp(name,"StressbalanceAnalysis")==0) return StressbalanceAnalysisEnum; 1496 1511 else if (strcmp(name,"StressbalanceConvergenceNumSteps")==0) return StressbalanceConvergenceNumStepsEnum; 1497 1512 else if (strcmp(name,"StressbalanceSIAAnalysis")==0) return StressbalanceSIAAnalysisEnum; -
issm/trunk-jpl/src/c/shared/Matrix/MatrixUtils.cpp
r24754 r26477 673 673 674 674 } /*}}}*/ 675 void CholeskyRealPositiveDefinite(IssmDouble* Lchol, IssmDouble* A, int ndim) { /*{{{*/ 676 /*CholeskyRealPositiveDefinite computes lower triangular matrix of the Cholesky decomposition of A 677 Follows the Cholesky–Banachiewicz algorithm 678 Lchol should point to an IssmDouble* of same dimensions as A*/ 679 for(int ii{0};ii<(ndim*ndim);ii++){Lchol[ii]=0;}; //ensure zero-initialization 680 for(int ii{0};ii<ndim;ii++){ 681 for(int jj{0};jj<=ii;jj++){ 682 double sum{0.0}; 683 for(int kk{0};kk<jj;kk++) { 684 sum += Lchol[ii*ndim+kk]*Lchol[jj*ndim+kk]; 685 } 686 if(ii==jj){Lchol[ii*ndim+jj] = sqrt(A[ii*ndim+jj]-sum);} 687 else{Lchol[ii*ndim+jj] = 1/Lchol[jj*ndim+jj] * (A[ii*ndim+jj]-sum);} 688 } 689 } 690 } /*}}}*/ -
issm/trunk-jpl/src/c/shared/Matrix/matrix.h
r26469 r26477 31 31 void cellsplit(IssmDouble** pcell, int m, int i,IssmDouble scale); 32 32 void cellecho(int numcells, int m, ...); 33 void CholeskyRealPositiveDefinite(IssmDouble* Lchol, IssmDouble* A, int ndim); 33 34 #endif //ifndef _MATRIXUTILS_H_ -
issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp
r26047 r26477 241 241 case 11: return SMBgradientscomponentsEnum; 242 242 case 12: return SMBsemicEnum; 243 case 55: return SMBautoregressionEnum; 243 244 default: _error_("Marshalled SMB code \""<<enum_in<<"\" not supported yet"); 244 245 }
Note:
See TracChangeset
for help on using the changeset viewer.