Changeset 24082
- Timestamp:
- 07/11/19 11:37:13 (6 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/modules/ParseToolkitsOptionsx/ParseToolkitsOptionsx.cpp
r22844 r24082 22 22 char word1[1000]; 23 23 char word2[1000]; 24 int my_rank;25 int i;26 24 27 25 /*intermediary: */ 28 int 29 char 30 char 31 char 32 char 33 char 34 char 35 int 36 int 26 int *analyses = NULL; 27 char **strings = NULL; 28 char *string = NULL; 29 char **toolkits = NULL; 30 char *toolkit = NULL; 31 char *newstring = NULL; 32 char *catstring = NULL; 33 int numanalyses; 34 int stringlength,toolkitlength; 37 35 38 36 /*Get my_rank:*/ 39 my_rank=IssmComm::GetRank();37 int my_rank=IssmComm::GetRank(); 40 38 41 39 if(my_rank==0){ … … 59 57 strings = xNew<char*>(numanalyses); 60 58 toolkits = xNew<char*>(numanalyses); 61 for(i =0;i<numanalyses;i++) strings[i] = NULL;62 for(i =0;i<numanalyses;i++) toolkits[i] = NULL;59 for(int i=0;i<numanalyses;i++) strings[i] = NULL; 60 for(int i=0;i<numanalyses;i++) toolkits[i] = NULL; 63 61 64 62 /*Go back to beginning of file:*/ … … 119 117 } 120 118 ISSM_MPI_Bcast(analyses,numanalyses,ISSM_MPI_INT,0,IssmComm::GetComm()); 121 for(i =0;i<numanalyses;i++){119 for(int i=0;i<numanalyses;i++){ 122 120 char* toolkit=toolkits[i]; 123 121 if(my_rank==0){ … … 147 145 148 146 /*Clean up and return*/ 149 for(i =0;i<numanalyses;i++) xDelete<char>(strings[i]);150 for(i =0;i<numanalyses;i++) xDelete<char>(toolkits[i]);147 for(int i=0;i<numanalyses;i++) xDelete<char>(strings[i]); 148 for(int i=0;i<numanalyses;i++) xDelete<char>(toolkits[i]); 151 149 xDelete<char*>(strings); 152 150 xDelete<char*>(toolkits); -
issm/trunk-jpl/src/c/modules/Solverx/Solverx.cpp
r15104 r24082 11 11 #include "./Solverx.h" 12 12 #include "../../shared/shared.h" 13 #include "../../classes/Params/Parameters.h" 13 14 14 15 void Solverx(Vector<IssmDouble>** puf, Matrix<IssmDouble>* Kff, Vector<IssmDouble>* pf, Vector<IssmDouble>* uf0,Vector<IssmDouble>* df, Parameters* parameters){ 15 16 16 /*intermediary: */ 17 Solver<IssmDouble> *solver=NULL; 18 19 /*output: */ 20 Vector<IssmDouble> *uf=NULL; 21 22 if(VerboseModule()) _printf0_(" Solving matrix system\n"); 23 24 /*Initialize solver: */ 25 solver=new Solver<IssmDouble>(Kff,pf,uf0,df,parameters); 17 /*Create Solver Object*/ 18 Solver<IssmDouble>* solver=new Solver<IssmDouble>(Kff,pf,uf0,df,parameters); 26 19 27 20 /*Solve:*/ 28 uf=solver->Solve(); 21 if(VerboseModule()) _printf0_(" Solving matrix system\n"); 22 Vector<IssmDouble>* uf=solver->Solve(); 23 24 /*Check convergence, if failed, try recovery model*/ 25 if(!checkconvergence(Kff,pf,uf,parameters)){ 26 27 _printf0_(" WARNING: Solver failed, Trying Recovery Mode\n"); 28 ToolkitsOptionsFromAnalysis(parameters,RecoveryAnalysisEnum); 29 delete uf; 30 uf=solver->Solve(); 31 32 if(!checkconvergence(Kff,pf,uf,parameters)) _error_("Recovery solver failed..."); 33 } 29 34 30 35 /*clean up and assign output pointers:*/ 36 _assert_(puf); 31 37 delete solver; 32 38 *puf=uf; 33 39 } 40 bool checkconvergence(Matrix<IssmDouble>* Kff,Vector<IssmDouble>* pf,Vector<IssmDouble>* uf,Parameters* parameters){ 41 42 /*Recover parameters: */ 43 IssmDouble solver_residue_threshold; 44 parameters->FindParam(&solver_residue_threshold,SettingsSolverResidueThresholdEnum); 45 46 /*don't check convergence if NaN*/ 47 if(xIsNan<IssmPDouble>(solver_residue_threshold)) return true; 48 49 /*compute KUF = KU - F = K*U - F*/ 50 Vector<IssmDouble>* KU = uf->Duplicate(); Kff->MatMult(uf,KU); 51 Vector<IssmDouble>* KUF = KU->Duplicate(); KU->Copy(KUF); KUF->AYPX(pf,-1.); 52 delete KU; 53 54 /*compute norm(KUF), norm(F)*/ 55 IssmDouble nKUF=KUF->Norm(NORM_TWO); 56 IssmDouble nF=pf->Norm(NORM_TWO); 57 delete KUF; 58 59 /*Check solver residue*/ 60 IssmDouble solver_residue=nKUF/nF; 61 if(VerboseConvergence()) _printf0_("\n solver residue: norm(KU-F)/norm(F)=" << solver_residue << "\n"); 62 if(xIsNan<IssmDouble>(solver_residue)) _error_("Solver residue is NaN"); 63 64 /*clean up*/ 65 66 /*Check convergence*/ 67 if(solver_residue>solver_residue_threshold){ 68 _printf0_(" solver residue too high!: norm(KU-F)/norm(F)=" << solver_residue << " => Trying recovery solver\n"); 69 return false; 70 } 71 else{ 72 return true; 73 } 74 75 } -
issm/trunk-jpl/src/c/modules/Solverx/Solverx.h
r15051 r24082 16 16 /* local prototypes: */ 17 17 void Solverx(Vector<IssmDouble>** puf, Matrix<IssmDouble>* Kff, Vector<IssmDouble>* pf, Vector<IssmDouble>* uf0,Vector<IssmDouble>* df, Parameters* parameters); 18 bool checkconvergence(Matrix<IssmDouble>* Kff,Vector<IssmDouble>* pf,Vector<IssmDouble>* uf,Parameters* parameters); 18 19 19 20 #endif /* _SOLVERX_H */ -
issm/trunk-jpl/src/c/shared/Enum/Enum.vim
r24080 r24082 1159 1159 syn keyword cConstant RegionaloutputEnum 1160 1160 syn keyword cConstant RegularEnum 1161 syn keyword cConstant RecoveryAnalysisEnum 1161 1162 syn keyword cConstant RiftfrontEnum 1162 1163 syn keyword cConstant SIAApproximationEnum -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r24080 r24082 1157 1157 RegionaloutputEnum, 1158 1158 RegularEnum, 1159 RecoveryAnalysisEnum, 1159 1160 RiftfrontEnum, 1160 1161 SIAApproximationEnum, -
issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
r24080 r24082 1161 1161 case RegionaloutputEnum : return "Regionaloutput"; 1162 1162 case RegularEnum : return "Regular"; 1163 case RecoveryAnalysisEnum : return "RecoveryAnalysis"; 1163 1164 case RiftfrontEnum : return "Riftfront"; 1164 1165 case SIAApproximationEnum : return "SIAApproximation"; -
issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
r24080 r24082 1188 1188 else if (strcmp(name,"Regionaloutput")==0) return RegionaloutputEnum; 1189 1189 else if (strcmp(name,"Regular")==0) return RegularEnum; 1190 else if (strcmp(name,"RecoveryAnalysis")==0) return RecoveryAnalysisEnum; 1190 1191 else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum; 1191 1192 else if (strcmp(name,"SIAApproximation")==0) return SIAApproximationEnum; … … 1243 1244 else if (strcmp(name,"SubelementFriction1")==0) return SubelementFriction1Enum; 1244 1245 else if (strcmp(name,"SubelementFriction2")==0) return SubelementFriction2Enum; 1245 else if (strcmp(name,"SubelementMelt1")==0) return SubelementMelt1Enum;1246 1246 else stage=11; 1247 1247 } 1248 1248 if(stage==11){ 1249 if (strcmp(name,"SubelementMelt2")==0) return SubelementMelt2Enum; 1249 if (strcmp(name,"SubelementMelt1")==0) return SubelementMelt1Enum; 1250 else if (strcmp(name,"SubelementMelt2")==0) return SubelementMelt2Enum; 1250 1251 else if (strcmp(name,"SubelementMigration")==0) return SubelementMigrationEnum; 1251 1252 else if (strcmp(name,"SurfaceSlopeSolution")==0) return SurfaceSlopeSolutionEnum; -
issm/trunk-jpl/src/c/solutionsequences/convergence.cpp
r24080 r24082 13 13 14 14 /*intermediary*/ 15 Vector<IssmDouble>* KU=NULL;16 Vector<IssmDouble>* KUF=NULL;17 15 Vector<IssmDouble>* KUold=NULL; 18 16 Vector<IssmDouble>* KUoldF=NULL; 19 17 Vector<IssmDouble>* duf=NULL; 20 18 IssmDouble ndu,nduinf,nu; 21 IssmDouble nKUF;22 19 IssmDouble nKUoldF; 23 20 IssmDouble nF; 24 IssmDouble solver_residue,res;21 IssmDouble res; 25 22 int analysis_type; 26 23 … … 32 29 *pconverged=true; 33 30 return; 34 }35 36 37 /*Display solver caracteristics*/38 if (VerboseConvergence()){39 40 41 42 /*compute KUF = KU - F = K*U - F*/43 KU=uf->Duplicate(); Kff->MatMult(uf,KU);44 KUF=KU->Duplicate(); KU->Copy(KUF); KUF->AYPX(pf,-1.0);45 46 /*compute norm(KUF), norm(F) and residue*/47 nKUF=KUF->Norm(NORM_TWO);48 nF=pf->Norm(NORM_TWO);49 solver_residue=nKUF/nF;50 _printf0_("\n" << " solver residue: norm(KU-F)/norm(F)=" << solver_residue << "\n");51 if(xIsNan<IssmDouble>(solver_residue)){52 //Kff->Echo();53 }54 55 /*clean up*/56 delete KU;57 delete KUF;58 31 } 59 32 -
issm/trunk-jpl/src/c/solutionsequences/solutionsequence_linear.cpp
r23587 r24082 18 18 Vector<IssmDouble>* df = NULL; 19 19 Vector<IssmDouble>* ys = NULL; 20 IssmDouble solver_residue_threshold;21 22 /*solver convergence test: */23 IssmDouble nKUF;24 IssmDouble nF;25 IssmDouble solver_residue;26 Vector<IssmDouble>* KU=NULL;27 Vector<IssmDouble>* KUF=NULL;28 20 29 21 /*Recover parameters: */ 30 femmodel->parameters->FindParam(&solver_residue_threshold,SettingsSolverResidueThresholdEnum);31 22 femmodel->UpdateConstraintsx(); 32 23 SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel); … … 38 29 femmodel->profiler->Stop(SOLVER); 39 30 40 /*Check that the solver converged nicely: */ 41 42 //compute KUF = KU - F = K*U - F 43 KU=uf->Duplicate(); Kff->MatMult(uf,KU); 44 KUF=KU->Duplicate(); KU->Copy(KUF); KUF->AYPX(pf,-1.0); 45 46 //compute norm(KUF), norm(F) and residue 47 nKUF=KUF->Norm(NORM_TWO); 48 nF=pf->Norm(NORM_TWO); 49 solver_residue=nKUF/nF; 50 51 if(!xIsNan(solver_residue_threshold) && solver_residue>solver_residue_threshold)_error_(" solver residue too high!: norm(KU-F)/norm(F)=" << solver_residue << "\n"); 52 53 //clean up 54 delete KU; delete KUF; 31 /*Clean up*/ 55 32 delete Kff; delete pf; delete df; 56 33 -
issm/trunk-jpl/src/m/classes/toolkits.js
r21065 r24082 29 29 } 30 30 } 31 32 this.RecoveryAnalysis = this.DefaultAnalysis; 31 33 }// }}} 32 34 this.disp = function(){// {{{ … … 94 96 //properties 95 97 // {{{ 96 this.DefaultAnalysis = []; 98 this.DefaultAnalysis = []; 99 this.RecoveryAnalysis = []; 97 100 //The other properties are dynamic 98 101 this.setdefaultparameters(); -
issm/trunk-jpl/src/m/classes/toolkits.m
r21049 r24082 6 6 classdef toolkits < dynamicprops 7 7 properties (SetAccess=public) 8 DefaultAnalysis = struct(); 8 DefaultAnalysis = struct(); 9 RecoveryAnalysis = struct(); 9 10 %The other properties are dynamic 10 11 end … … 54 55 end 55 56 57 %Use same solver for Recovery mode 58 self.RecoveryAnalysis = self.DefaultAnalysis; 59 60 56 61 end % }}} 57 62 function disp(self) % {{{ … … 73 78 end % }}} 74 79 function ToolkitsFile(toolkits,filename) % {{{ 75 %TOOLKITSFILE - build toolkits file76 %77 % Build a Petsc compatible options file, from the toolkits model field + return options string.78 % This file will also be used when the toolkit used is 'issm' instead of 'petsc'79 %80 % Usage: ToolkitsFile(toolkits,filename);80 %TOOLKITSFILE - build toolkits file 81 % 82 % Build a Petsc compatible options file, from the toolkits model field + return options string. 83 % This file will also be used when the toolkit used is 'issm' instead of 'petsc' 84 % 85 % Usage: ToolkitsFile(toolkits,filename); 81 86 82 87 %open file for writing … … 122 127 fclose(fid); 123 128 end %}}} 124 function savemodeljs(self,fid,modelname) % {{{125 126 analyses=properties(self);129 function savemodeljs(self,fid,modelname) % {{{ 130 131 analyses=properties(self); 127 132 for i=1:numel(analyses), 128 133 if isempty(fieldnames(self.(analyses{i}))) … … 132 137 end 133 138 end 134 135 end % }}}139 140 end % }}} 136 141 end 137 142 end -
issm/trunk-jpl/src/m/classes/toolkits.py
r23716 r24082 31 31 raise IOError("ToolkitsFile error: need at least Mumps or Gsl to define issm solver type") 32 32 33 #The other properties are dynamic 33 #Use same solver for Recovery mode 34 self.RecoveryAnalysis = self.DefaultAnalysis 35 36 #The other properties are dynamic 34 37 # }}} 35 38 def __repr__(self): # {{{
Note:
See TracChangeset
for help on using the changeset viewer.