PageRenderTime 31ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/DataAssimilation/common/data_assimilation_routines.h

http://github.com/xyan075/examples
C Header | 1398 lines | 915 code | 248 blank | 235 comment | 87 complexity | a5c27bede34902184ef0e3c81debb85c MD5 | raw file
  1. //command: mpiexec -n 1 ./01 -measurement-noise-scale 0.1 -global-noise-scale 0.1 -initialization-error 100 -measurement-noise-amount 100
  2. static char help[] = "rUKF approach.\n\
  3. ... \n\n";
  4. #undef __FUNCT__
  5. #define __FUNCT__ "main"
  6. #define PETSC_OPERATIONS_DEBUG 1
  7. #include "slepcsvd.h"
  8. #include "petscksp.h"
  9. #include "petscmat.h"
  10. #include <stdlib.h>
  11. #include <assert.h>
  12. #include <gsl/gsl_errno.h>
  13. #include <gsl/gsl_spline.h>
  14. #include "data_assimilation_utility_routines.h"
  15. #define ERROR_TYPE_COMMON 1
  16. #define INFO_PETSC_INT 1
  17. #define INFO_PETSC_REAL 2
  18. #define INFO_PETSC_VEC 3
  19. #define INFO_PETSC_MAT 4
  20. #define INFO_PETSC_INTARRAY 5
  21. #define INFO_PETSC_REALARRAY 6
  22. #define FILTER_TYPE_RUKF 7
  23. #define MEAUSREMENT_TYPE_FROM_HEADER_AND_DAT_FILES 1
  24. #define DIAGNOSIS_DISP_EVERYTHING 0x8000
  25. #define DIAGNOSIS_DISP_MEDIUM 0x4000
  26. #define DIAGNOSIS_DISP_MINIMUM 0x2000
  27. #define DIAGNOSIS_DISP_INITIAL_CONF 0x0001
  28. #define app_context_assert(x,msg,app_context) {if(!(x)) app_context_report_error(ERROR_TYPE_COMMON, msg, app_context, __LINE__,__FUNCT__,__FILE__);}
  29. #ifndef MEASUREMENT_DIR
  30. #define MEASUREMENT_DIR "./" //where to find the measurement files
  31. #endif
  32. #define MAX_SIZE_PATH_NAME 256
  33. #define MAX_SIZE_FILE_NAME 128
  34. //-------------------------------------------------------------------------------------------------
  35. //---structures definitions---
  36. struct _APP_CONTEXT_TYPE{
  37. MPI_Comm mpi_comm_global;//process in the work group
  38. MPI_Comm mpi_comm_local; //this process
  39. PetscViewer pv_global;
  40. PetscViewer pv_local;
  41. PetscErrorCode ierr;
  42. PetscInt diagnosisMode;
  43. PetscReal measurement_noise_scale; // for R
  44. PetscReal global_noise_scale; // for both R and P_0
  45. // PetscReal initialization_error; // for theta_0
  46. PetscReal measurement_noise_amount; // for y_k
  47. PetscInt n_x;//ndof
  48. PetscInt n_theta; //npdof
  49. PetscReal* x_0;
  50. PetscReal x_scale_constant;
  51. PetscReal* x_scale; //currently initialized from x_scale_constant;
  52. PetscReal* theta_truth;
  53. PetscReal* theta_0;
  54. PetscReal* theta_scale;
  55. //temporary storage for computation
  56. //-SVD related
  57. Mat S_ensemble; //ensemble matrix, only for storage purpose (for doing SVD), app_context->n_x+app_context->n_theta by model->n_ensem
  58. Mat S_ensemble2; //ensemble matrix, only for storage purpose (for S_ensemble*S_ensemble2^T)
  59. Mat P_z; //BIG! error covariance for the augmented state vecotr, used by rUKF for doing SVD,app_context->n_x+app_context->n_theta by app_context->n_x+app_context->n_theta
  60. Mat S_z; //SVD result of P_z, app_context->n_x+app_context->n_theta by filter->subfilter->r
  61. Mat S_bar; //used in the measurement update by rUKF, measurement->n_y by filter->subfilter->r
  62. Mat S_bar2; //temperory storage for a matrix of the size measurement->n_y by filter->subfilter->r
  63. //-general temperory usage
  64. Mat tmp_r; // r by r matrix
  65. Mat tmp_nz_by_r;
  66. Mat tmp_r_by_ny;
  67. Vec tmp_z; //n_x+n_theta by 1 vector
  68. Vec tmp_x; //n_x by 1 vector
  69. Vec tmp_theta; //n_theta by 1 vector
  70. Vec tmp_y; //measurement->n_y by 1 vector
  71. PetscInt* tmp_x_indices;
  72. PetscInt* tmp_theta_indices;
  73. //measurement info
  74. char* measurement_dir_name;
  75. char* measurement_header_file_name;
  76. char* measurement_data_file_name;
  77. char* measurement_matrix_file_name;
  78. char* measurement_error_covariance_matrix_file_name;
  79. int measurementType;
  80. };
  81. typedef struct _APP_CONTEXT_TYPE APP_CONTEXT_TYPE;
  82. struct _MODEL_TYPE{
  83. struct _MODEL_TYPE* (*f)(struct _MODEL_TYPE*, APP_CONTEXT_TYPE*); //f: model forward operator : n (number of ensembles) states at k --> n states at k+1 (n>=1)
  84. PetscInt n_x;//ndof
  85. PetscInt n_theta;
  86. PetscInt n_z;
  87. Vec x_k_hat;
  88. Vec theta_k_hat;
  89. Vec x_k_minus_1_hat;
  90. Vec theta_k_minus_1_hat;
  91. PetscInt k; //time step
  92. PetscReal t; //time
  93. PetscInt n_ensem; //number of ensembles
  94. Vec* x_k_minus_1;
  95. Vec* theta_k_minus_1;
  96. Vec* x_k;
  97. Vec* theta_k;
  98. // measurementDisplacementScale=[];
  99. //ipfibreNums=[];
  100. //fixed_contractility_factor=[];
  101. //phase=[];
  102. //Cai_i_max=[];
  103. //parameter_permutation_matrx =[];
  104. //repeatScaleFacotrs =[];
  105. //repeatNumber=[];
  106. };
  107. typedef struct _MODEL_TYPE MODEL_TYPE;
  108. struct _FILTER_SUBTYPE{
  109. PetscInt filter_type;
  110. PetscInt r; //rank ( r>=(n_theat>0)?n_theat:n_x, r<= n_theta+n_x;
  111. Mat P_x; //BIG! error covariance for the state vecotr, not used by rUKF
  112. Mat P_theta; //error covariance for the parameter vector, not used by rUKF
  113. Mat S_x; //square-root of P_x
  114. Mat S_theta; //square-root of P_theta
  115. };
  116. typedef struct _FILTER_SUBTYPE FILTER_SUBTYPE;
  117. struct _FILTER_TYPE{
  118. PetscInt n_x; //ndof, n_x>=0
  119. PetscInt n_theta; //ndof, n_theta>=0
  120. PetscInt n_z;
  121. Mat K; //Kalman gain matrix, n_x + n_theta by measurement->n_y
  122. // Vec x;
  123. // Vec theta;
  124. // PetscInt filter_type;
  125. FILTER_SUBTYPE* subfilter; //FILTER_SUBTYPE
  126. };
  127. typedef struct _FILTER_TYPE FILTER_TYPE;
  128. struct _OPTIMIZER_TYPE{
  129. PetscInt n_theta; //ndof
  130. };
  131. typedef struct _OPTIMIZER_TYPE OPTIMIZER_TYPE;
  132. struct _MEAUSREMENT_TYPE{
  133. //Vec k_y;
  134. //Vec t_y;
  135. Vec y; //measurement_petsc_vector, current measurement in use(maybe interpolated), n_y by 1
  136. Mat H; //measurement matrix, n_y by n_z
  137. Mat R_d; //measurement error covariance, n_y by n_y
  138. Mat inv_R_d; //measurement error covariance inverse, n_y by n_y
  139. int n_y;//length of single measurement vector
  140. int n_z;//length of state vector
  141. int K; //number of measurements
  142. int nMeta; //default 2
  143. double* map_index2time; //nMeta(2, index, time) by K
  144. double* all_measurements; //n_y by K
  145. double* single_measurement; //n_y by 1
  146. double* H_values; //n_y by n_z;
  147. double* R_d_values;//n_y by n_y
  148. // Vec theta_y; //ground-truth parameter
  149. //xiCoordsFileName=[];
  150. //sampleType=[];
  151. //nSampleOrder=[];
  152. //elementsID=[];
  153. //facesID=[];
  154. //tempDirID =[];
  155. //experimentID =[];
  156. };
  157. typedef struct _MEAUSREMENT_TYPE MEAUSREMENT_TYPE;
  158. //-------------------------------------------------------------------------------------------------
  159. //---all routines---
  160. PetscErrorCode
  161. app_context_report_error(PetscErrorCode errorcode, const char* msg, APP_CONTEXT_TYPE* app_context, int lineNum, const char* funct, const char* file);
  162. PetscErrorCode
  163. app_context_report_info(PetscInt info_type, PetscInt info_size, void* info, const char* msg, APP_CONTEXT_TYPE* app_context);
  164. int
  165. app_context_destroy_and_finalize(APP_CONTEXT_TYPE* app_context);
  166. APP_CONTEXT_TYPE*
  167. app_context_create_and_initialize(int argc,char **args);
  168. MODEL_TYPE*
  169. model_create_and_initialize(MODEL_TYPE* (*model_opeartor)(MODEL_TYPE*, APP_CONTEXT_TYPE*), APP_CONTEXT_TYPE* app_context);
  170. MODEL_TYPE*
  171. model_set_opeartor_and_intial_condition(MODEL_TYPE* model, MODEL_TYPE* (*model_opeartor)(MODEL_TYPE*, APP_CONTEXT_TYPE*), APP_CONTEXT_TYPE* app_context);
  172. FILTER_TYPE*
  173. filter_create_and_initialize(APP_CONTEXT_TYPE* app_context,MODEL_TYPE* model);
  174. FILTER_TYPE*
  175. filter_set_intial_condition(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context);
  176. OPTIMIZER_TYPE*
  177. optimizer_create_and_initialize(APP_CONTEXT_TYPE* app_context);
  178. OPTIMIZER_TYPE*
  179. optimizer_set_intial_condition(OPTIMIZER_TYPE* optimizer, APP_CONTEXT_TYPE* app_context);
  180. //create and initialize the filter
  181. FILTER_SUBTYPE*
  182. filter_subtype_create_and_initialize(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context);
  183. // Initialize the filter subtype
  184. // PetscInt filter_type;
  185. // PetscInt r; //rank ( r>=(n_theat>0)?n_theat:1, r<= n_theta+n_x;
  186. // Mat S_x;
  187. // Mat S_theta;
  188. FILTER_SUBTYPE*
  189. filter_subtype_set_intial_condition(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context);
  190. //-------------------------------------------------------------------------------------------------
  191. //---app_context routines---
  192. PetscErrorCode
  193. app_context_report_error(PetscErrorCode errorcode, const char* msg, APP_CONTEXT_TYPE* app_context, int lineNum, const char* funct, const char* file)
  194. {
  195. static int previous_lineNum=0;
  196. if(errorcode){
  197. PetscPrintf(app_context->mpi_comm_global, "== fatal error: %s: at line %d, function %s(), file %s. prevous line number: %d \n", msg, lineNum, funct, file,previous_lineNum);
  198. //CHKERRQ(app_context->ierr); //if errorcode is non-zero,
  199. SETERRQ(errorcode,msg);
  200. }else{
  201. previous_lineNum = lineNum;
  202. return 0;
  203. }
  204. }
  205. PetscErrorCode
  206. app_context_report_info(PetscInt info_type, PetscInt info_size, void* info, const char* msg, APP_CONTEXT_TYPE* app_context)
  207. {
  208. app_context->ierr = PetscPrintf(app_context->mpi_comm_global, "== info: %s: ", msg);
  209. //app_context_report_error(app_context->ierr,"app_context_report_info: PetscPrintf",app_context,__LINE__,__FUNCT__,__FILE__);
  210. switch(info_type)
  211. {
  212. case INFO_PETSC_INT:
  213. case INFO_PETSC_INTARRAY:
  214. app_context->ierr = PetscIntView(info_size, (PetscInt*)info, app_context->pv_global);
  215. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_INT",app_context,__LINE__,__FUNCT__,__FILE__);
  216. break;
  217. case INFO_PETSC_REAL:
  218. case INFO_PETSC_REALARRAY:
  219. app_context->ierr = PetscRealView(info_size, (PetscReal*)info, app_context->pv_global);
  220. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_REAL",app_context,__LINE__,__FUNCT__,__FILE__);
  221. break;
  222. case INFO_PETSC_VEC:
  223. app_context->ierr = PetscPrintf(app_context->mpi_comm_global, "\n", msg);
  224. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_VEC",app_context,__LINE__,__FUNCT__,__FILE__);
  225. app_context->ierr = VecView( *((Vec*)info), app_context->pv_global);
  226. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_VEC",app_context,__LINE__,__FUNCT__,__FILE__);
  227. break;
  228. case INFO_PETSC_MAT:
  229. app_context->ierr = PetscPrintf(app_context->mpi_comm_global, "\n", msg);
  230. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_MAT",app_context,__LINE__,__FUNCT__,__FILE__);
  231. app_context->ierr = MatView( *((Mat*)info), app_context->pv_global);
  232. app_context_report_error(app_context->ierr,"app_context_report_info: INFO_PETSC_MAT",app_context,__LINE__,__FUNCT__,__FILE__);
  233. break;
  234. default:
  235. app_context->ierr = PetscPrintf(app_context->mpi_comm_global, "== wrong info_type: %d\n", info_type);
  236. app_context_report_error(app_context->ierr,"app_context_report_info: default",app_context,__LINE__,__FUNCT__,__FILE__);
  237. break;
  238. }
  239. app_context->ierr = PetscPrintf(app_context->mpi_comm_global, "\n");
  240. app_context_report_error(app_context->ierr,"app_context_report_info: PetscPrintf",app_context,__LINE__,__FUNCT__,__FILE__);
  241. return 0;
  242. }
  243. APP_CONTEXT_TYPE*
  244. app_context_create_and_initialize(int argc,char **args)
  245. {
  246. APP_CONTEXT_TYPE* app_context = NULL;
  247. PetscTruth flg = PETSC_FALSE, flg_1=PETSC_FALSE;
  248. int i=0;
  249. // char options[2][PETSC_MAX_PATH_LEN]; /* input file name */
  250. //app_context->ierr = PetscMalloc(sizeof(APP_CONTEXT_TYPE), (void **) &app_context);
  251. app_context = (APP_CONTEXT_TYPE*) malloc(sizeof(APP_CONTEXT_TYPE));
  252. if(app_context==NULL){
  253. PetscPrintf(MPI_COMM_WORLD, "== fatal error: app_context_create_and_initialize: app_context==NULL");
  254. PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,ERROR_TYPE_COMMON,1,"app_context_create_and_initialize: app_context==NULL");
  255. return NULL;
  256. }
  257. //app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscMalloc",app_context);
  258. //program initialization
  259. // PetscInitialize(&argc,&args,(char *)0,help);
  260. SlepcInitialize(&argc,&args,(char*)0,(char*) 0);
  261. app_context->mpi_comm_local=MPI_COMM_SELF;
  262. app_context->mpi_comm_global=MPI_COMM_WORLD;
  263. app_context->pv_global=PETSC_VIEWER_STDOUT_WORLD;
  264. app_context->pv_local=PETSC_VIEWER_STDOUT_SELF;
  265. PetscViewerSetFormat(app_context->pv_local, PETSC_VIEWER_ASCII_MATLAB) ; //PETSC_VIEWER_ASCII_INDEX);
  266. PetscViewerSetFormat(app_context->pv_global, PETSC_VIEWER_ASCII_MATLAB) ;//PETSC_VIEWER_ASCII_INDEX);
  267. // --- program parameter initialization ----
  268. //default values
  269. app_context->diagnosisMode = DIAGNOSIS_DISP_INITIAL_CONF | DIAGNOSIS_DISP_EVERYTHING;
  270. app_context->measurement_noise_scale = 0.25;
  271. app_context->global_noise_scale = 0.0001;
  272. // app_context->initialization_error = 0.5;
  273. app_context->measurement_noise_amount = 0.0;
  274. app_context->n_x = 2;
  275. app_context->x_scale_constant=1.0;
  276. PetscMalloc(sizeof(PetscReal)*app_context->n_x, (void**) &app_context->x_0);
  277. app_context->x_0[0] = 1.0;
  278. app_context->x_0[1] = 1.0;
  279. app_context->n_theta = 2 ;
  280. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void**) &app_context->theta_truth);
  281. app_context->theta_truth[0] = 1.0;
  282. app_context->theta_truth[1] = 1.0;
  283. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void**) &app_context->theta_0);
  284. app_context->theta_0[0] = 1.5;
  285. app_context->theta_0[1] = 0.5;
  286. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void**) &app_context->theta_scale);
  287. app_context->theta_scale[0] = 1.0;
  288. app_context->theta_scale[1] = 1.0;
  289. //user-defined values
  290. app_context->ierr = PetscOptionsGetReal(PETSC_NULL,"-measurement-noise-scale",&app_context->measurement_noise_scale,&flg);
  291. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetReal",app_context,__LINE__,__FUNCT__,__FILE__);
  292. app_context->ierr = PetscOptionsGetReal(PETSC_NULL,"-global-noise-scale",&app_context->global_noise_scale,&flg);
  293. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetReal",app_context,__LINE__,__FUNCT__,__FILE__);
  294. // app_context->ierr = PetscOptionsGetReal(PETSC_NULL,"-initialization-error",&app_context->initialization_error,&flg);
  295. // app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetReal",app_context,__LINE__,__FUNCT__,__FILE__);
  296. app_context->ierr = PetscOptionsGetReal(PETSC_NULL,"-measurement-noise-amount",&app_context->measurement_noise_amount,&flg);
  297. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetReal",app_context,__LINE__,__FUNCT__,__FILE__);
  298. //app_context->x_0
  299. app_context->ierr = PetscOptionsGetInt(PETSC_NULL,"-n-x",&app_context->n_x,&flg);
  300. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetInt",app_context,__LINE__,__FUNCT__,__FILE__);
  301. if(flg){ //resize the array
  302. PetscFree(app_context->x_0);
  303. app_context->ierr=PetscMalloc(sizeof(PetscReal)*app_context->n_x, (void **) &app_context->x_0);
  304. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  305. }
  306. flg_1 = flg;
  307. PetscOptionsHasName(PETSC_NULL,"-x-0",&flg);
  308. if( flg_1 | flg ){
  309. app_context_report_error(ERROR_TYPE_COMMON,"app_context_create_and_initialize: -n-x and -x_0 should be given together",app_context,__LINE__,__FUNCT__,__FILE__);
  310. }
  311. PetscOptionsHasName(PETSC_NULL,"-x-0",&flg);
  312. if(flg){
  313. app_context->ierr = PetscOptionsGetRealArray(PETSC_NULL,"-x-0",app_context->x_0, &app_context->n_x,&flg);
  314. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetInt",app_context,__LINE__,__FUNCT__,__FILE__);
  315. }
  316. //x_scale_constant
  317. app_context->ierr = PetscOptionsGetReal(PETSC_NULL,"-x-scale",&app_context->x_scale_constant, &flg);
  318. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetReal x_scale",app_context,__LINE__,__FUNCT__,__FILE__);
  319. //x-scale
  320. app_context->ierr = PetscMalloc(sizeof(PetscReal)*app_context->n_x, (void **) &app_context->x_scale);
  321. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  322. for(i=0; i<app_context->n_x; i++)
  323. app_context->x_scale[i]=app_context->x_scale_constant;
  324. //app_context->theta_truth
  325. app_context->ierr = PetscOptionsGetInt(PETSC_NULL,"-n-theta-truth",&app_context->n_theta,&flg);
  326. app_context_assert(app_context->n_theta>=0, "", app_context);
  327. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetInt",app_context,__LINE__,__FUNCT__,__FILE__);
  328. if(flg){ //resize the array
  329. PetscFree(app_context->x_0);
  330. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void **) &app_context->theta_truth);
  331. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  332. }
  333. flg_1 = flg;
  334. PetscOptionsHasName(PETSC_NULL,"-theta-truth",&flg);
  335. if( app_context->n_theta>0 && (flg_1 | flg) ){
  336. app_context_report_error(ERROR_TYPE_COMMON,"app_context_create_and_initialize: -n-theta-truth and -theta_truth should be given together",app_context,__LINE__,__FUNCT__,__FILE__);
  337. }
  338. if(app_context->n_theta>0 && flg){
  339. app_context->ierr = PetscOptionsGetRealArray(PETSC_NULL,"-theta-truth",app_context->theta_truth,&app_context->n_theta, &flg);
  340. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetRealArray",app_context,__LINE__,__FUNCT__,__FILE__);
  341. }
  342. //app_context->theta_0
  343. app_context->ierr = PetscOptionsGetInt(PETSC_NULL,"-n-theta-0",&app_context->n_theta,&flg);
  344. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetInt",app_context,__LINE__,__FUNCT__,__FILE__);
  345. if(flg){ //resize the array
  346. if(app_context->n_theta != sizeof(app_context->theta_truth)/sizeof(PetscReal))
  347. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: -n-theta-0 is different from -n-theta-truth",app_context,__LINE__,__FUNCT__,__FILE__);
  348. PetscFree(app_context->x_0);
  349. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void **) &app_context->theta_0);
  350. }
  351. flg_1 = flg;
  352. PetscOptionsHasName(PETSC_NULL,"-theta-0",&flg);
  353. if( flg_1 | flg ){
  354. app_context_report_error(ERROR_TYPE_COMMON,"app_context_create_and_initialize: -n-theta-0 and -theta_0 should be given together",app_context,__LINE__,__FUNCT__,__FILE__);
  355. }
  356. if(flg){
  357. app_context->ierr = PetscOptionsGetRealArray(PETSC_NULL,"-theta-0",app_context->theta_0,&app_context->n_theta, &flg);
  358. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetIntArray",app_context,__LINE__,__FUNCT__,__FILE__);
  359. }
  360. //app_context->theta_scale
  361. app_context->ierr = PetscOptionsGetInt(PETSC_NULL,"-n-theta-scale",&app_context->n_theta,&flg);
  362. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetInt",app_context,__LINE__,__FUNCT__,__FILE__);
  363. if(flg){ //resize the array
  364. if(app_context->n_theta != sizeof(app_context->theta_truth)/sizeof(PetscReal))
  365. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: -n-theta-scale is different from -n-theta",app_context,__LINE__,__FUNCT__,__FILE__);
  366. PetscFree(app_context->theta_scale);
  367. PetscMalloc(sizeof(PetscReal)*app_context->n_theta, (void **) &app_context->theta_scale);
  368. }
  369. flg_1 = flg;
  370. PetscOptionsHasName(PETSC_NULL,"-theta-scale",&flg);
  371. if( flg_1 | flg ){
  372. app_context_report_error(ERROR_TYPE_COMMON,"app_context_create_and_initialize: n_theta_scale and -theta-scale should be given together",app_context,__LINE__,__FUNCT__,__FILE__);
  373. }
  374. if(flg){
  375. app_context->ierr = PetscOptionsGetRealArray(PETSC_NULL,"-theta-scale",app_context->theta_scale,&app_context->n_theta, &flg);
  376. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscOptionsGetRealArray",app_context,__LINE__,__FUNCT__,__FILE__);
  377. }
  378. //echo configuration information
  379. if(app_context->diagnosisMode & DIAGNOSIS_DISP_INITIAL_CONF){
  380. app_context->ierr = app_context_report_info(INFO_PETSC_REAL,1, &app_context->measurement_noise_scale,"measurement_noise_scale", app_context);
  381. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  382. app_context->ierr = app_context_report_info(INFO_PETSC_REAL,1, &app_context->global_noise_scale,"global_noise_scale", app_context);
  383. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  384. //app_context->ierr = app_context_report_info(INFO_PETSC_REAL,1, &app_context->initialization_error,"initialization_error", app_context);
  385. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  386. app_context->ierr = app_context_report_info(INFO_PETSC_INT,1, &app_context->n_x,"n_x", app_context);
  387. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  388. app_context->ierr = app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_x, app_context->x_0,"x_0", app_context);
  389. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  390. app_context->ierr = app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_x, app_context->x_scale,"x_scale", app_context);
  391. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  392. app_context->ierr = app_context_report_info(INFO_PETSC_INT,1, &app_context->n_theta,"n_theta", app_context);
  393. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  394. app_context->ierr = app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_theta, app_context->theta_truth,"theta_truth", app_context);
  395. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  396. app_context->ierr = app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_theta, app_context->theta_0,"theta_0", app_context);
  397. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  398. app_context->ierr = app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_theta, app_context->theta_scale,"theta_scale", app_context);
  399. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: app_context_report_info",app_context,__LINE__,__FUNCT__,__FILE__);
  400. }
  401. //--allocate temp space
  402. VecCreate(app_context->mpi_comm_global, &app_context->tmp_x);
  403. VecCreate(app_context->mpi_comm_global, &app_context->tmp_theta);
  404. VecCreate(app_context->mpi_comm_global, &app_context->tmp_z);
  405. VecSetSizes(app_context->tmp_x, PETSC_DECIDE,app_context->n_x);
  406. VecSetSizes(app_context->tmp_theta, PETSC_DECIDE,app_context->n_theta);
  407. VecSetSizes(app_context->tmp_z, PETSC_DECIDE,app_context->n_x+app_context->n_theta);
  408. app_context->ierr=PetscMalloc(sizeof(PetscInt)*app_context->n_x, &app_context->tmp_x_indices);
  409. app_context_report_error(app_context->ierr,"PetscMalloc: app_context->tmp_x_indices",app_context,__LINE__,__FUNCT__,__FILE__);
  410. app_context->ierr=PetscMalloc(sizeof(PetscInt)*app_context->n_theta, &app_context->tmp_theta_indices);
  411. app_context_report_error(app_context->ierr,"PetscMalloc: app_context->tmp_theta_indices",app_context,__LINE__,__FUNCT__,__FILE__);
  412. VecSetFromOptions(app_context->tmp_x);
  413. VecSetFromOptions(app_context->tmp_theta);
  414. VecSetFromOptions(app_context->tmp_z);
  415. //measurement
  416. app_context->measurement_dir_name = new char[MAX_SIZE_PATH_NAME+1];
  417. app_context->measurement_data_file_name = new char[MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME+1];
  418. app_context->measurement_header_file_name = new char[MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME+1];
  419. app_context->measurement_matrix_file_name = new char[MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME+1];
  420. app_context->measurement_error_covariance_matrix_file_name = new char[MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME+1];
  421. PetscOptionsGetString(PETSC_NULL,"-measurement_dir_name", app_context->measurement_dir_name,MAX_SIZE_PATH_NAME,&flg);
  422. if(flg==PETSC_FALSE) sprintf(app_context->measurement_dir_name, "%smeasurement/", MEASUREMENT_DIR);
  423. PetscOptionsGetString(PETSC_NULL,"-measurement_header_file_name", app_context->measurement_header_file_name,MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME,&flg);
  424. if(flg==PETSC_FALSE)
  425. sprintf(app_context->measurement_header_file_name, "%sheader", app_context->measurement_dir_name);
  426. else if(!strchr(app_context->measurement_header_file_name,'/'))
  427. sprintf(app_context->measurement_header_file_name, "%s%s", app_context->measurement_dir_name,app_context->measurement_header_file_name);
  428. else{}
  429. PetscOptionsGetString(PETSC_NULL,"-measurement_matrix_file_name", app_context->measurement_matrix_file_name,MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME,&flg);
  430. if(flg==PETSC_FALSE)
  431. sprintf(app_context->measurement_matrix_file_name, "%sH.dat", app_context->measurement_dir_name);
  432. else if(!strchr(app_context->measurement_matrix_file_name,'/'))
  433. sprintf(app_context->measurement_matrix_file_name, "%s%s", app_context->measurement_dir_name,app_context->measurement_matrix_file_name);
  434. else{}
  435. PetscOptionsGetString(PETSC_NULL,"-measurement_error_covariance_matrix_file_name", app_context->measurement_error_covariance_matrix_file_name,MAX_SIZE_FILE_NAME+MAX_SIZE_PATH_NAME,&flg);
  436. if(flg==PETSC_FALSE)
  437. sprintf(app_context->measurement_error_covariance_matrix_file_name, "%sR_d.dat", app_context->measurement_dir_name);
  438. else if(!strchr(app_context->measurement_error_covariance_matrix_file_name,'/'))
  439. sprintf(app_context->measurement_error_covariance_matrix_file_name, "%s%s", app_context->measurement_dir_name,app_context->measurement_error_covariance_matrix_file_name);
  440. else{}
  441. PetscOptionsGetInt(PETSC_NULL,"-measurementType",&app_context->measurementType,&flg);
  442. if(flg==PETSC_FALSE) app_context->measurementType=MEAUSREMENT_TYPE_FROM_HEADER_AND_DAT_FILES;
  443. return app_context;
  444. }
  445. int
  446. app_context_destroy_and_finalize(APP_CONTEXT_TYPE* app_context)
  447. {
  448. if(app_context==NULL){
  449. PetscPrintf(MPI_COMM_WORLD, "== fatal error: app_context_create_and_initialize: app_context==NULL");
  450. PetscError(__LINE__,__FUNCT__,__FILE__,__SDIR__,ERROR_TYPE_COMMON,1,"app_context_finalize: app_context==NULL");
  451. return 1;
  452. }
  453. // app_context->ierr = PetscFinalize(); CHKERRQ(app_context->ierr);
  454. app_context->ierr = SlepcFinalize(); CHKERRQ(app_context->ierr);
  455. return 0;
  456. }
  457. //-------------------------------------------------------------------------------------------------
  458. //---measurement routines---
  459. //load single mesurement from .dat file with simple format: % dimension length(V) 1\n V \n
  460. // into measurement->single_measurement
  461. int
  462. measurement_io_read_single_measurement_dat(char* filename, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  463. {
  464. int measurement_size_1 = 0, measurement_size_2 = 0;
  465. if(measurement->single_measurement) free(measurement->single_measurement);
  466. measurement->single_measurement = load_matrix_2D_ascii(filename, measurement_size_1, measurement_size_2);
  467. assert(measurement_size_2==1); assert(measurement_size_1 > 1);
  468. measurement->n_y = measurement_size_1;
  469. return 0;
  470. }
  471. //write .dat file with simple format: length(V) \n V \n
  472. int
  473. measurement_io_write_single_measurement_dat(char* filename, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  474. {
  475. int ret = 0;
  476. if(measurement->single_measurement) ret = save_matrix_2D_ascii(filename, measurement->single_measurement, measurement->n_y, 1, NULL);
  477. assert(ret==0);
  478. return 0;
  479. }
  480. //load all meausrment into measurement data structure
  481. int
  482. measurement_io_read_all_measurements(MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  483. {
  484. int meta_info_size_1 = 0, meta_info_size_2 = 0;
  485. //header + dat files
  486. if(app_context->measurementType==MEAUSREMENT_TYPE_FROM_HEADER_AND_DAT_FILES){
  487. //load header file
  488. measurement->map_index2time = load_matrix_2D_ascii(app_context->measurement_header_file_name, meta_info_size_1, meta_info_size_2);
  489. assert(meta_info_size_1 == 2); assert(meta_info_size_2 > 2);
  490. measurement->K = meta_info_size_2;
  491. //load each measurement
  492. measurement->all_measurements = new double[measurement->n_y*measurement->K];
  493. for (int i=0; i<measurement->K; i++){
  494. sprintf(app_context->measurement_data_file_name, "%s%04d.dat", app_context->measurement_dir_name, (int)measurement->map_index2time[i*2+0]);
  495. measurement_io_read_single_measurement_dat(app_context->measurement_data_file_name, measurement, app_context);
  496. for (int j=0; j<measurement->n_y; j++) measurement->all_measurements[j*measurement->K+i]=measurement->single_measurement[j];
  497. }
  498. }
  499. return 0;
  500. }
  501. //create (Vec) measurement->y from (double*) measurement->single_measurement
  502. int
  503. measurement_petsc_vector_assemble(MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  504. {
  505. static int* index = NULL;
  506. if(index==NULL) {
  507. index = new int[measurement->n_y];
  508. VecCreate(app_context->mpi_comm_global, &measurement->y);
  509. VecSetSizes(measurement->y, PETSC_DECIDE, measurement->n_y);
  510. VecSetFromOptions(measurement->y);
  511. for (int i = 0; i<measurement->n_y; i++) index[i]=i;
  512. }
  513. app_context->ierr=VecSetValues(measurement->y,measurement->n_y, index, measurement->single_measurement,ADD_VALUES);
  514. app_context_report_error(app_context->ierr,"measurement_petsc_vector_assemble: VecSetValues",app_context,__LINE__,__FUNCT__,__FILE__);
  515. app_context->ierr=VecAssemblyBegin(measurement->y);
  516. app_context_report_error(app_context->ierr,"measurement_petsc_vector_assemble: VecAssemblyBegin",app_context,__LINE__,__FUNCT__,__FILE__);
  517. app_context->ierr=VecAssemblyEnd(measurement->y);
  518. app_context_report_error(app_context->ierr,"measurement_petsc_vector_assemble: VecAssemblyEnd",app_context,__LINE__,__FUNCT__,__FILE__);
  519. return 0;
  520. }
  521. //create (double*) measurement->single_measurement from (Vec) measurement->y
  522. int
  523. measurement_petsc_vector_disassemble(MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  524. {
  525. static int* index = NULL;
  526. if(index==NULL) {
  527. index = new int[measurement->n_y];
  528. for (int i = 0; i<measurement->n_y; i++) index[i]=i;
  529. }
  530. app_context->ierr=VecGetValues(measurement->y,measurement->n_y, index, measurement->single_measurement);
  531. app_context_report_error(app_context->ierr,"measurement_petsc_vector_disassemble: VecGetValues",app_context,__LINE__,__FUNCT__,__FILE__);
  532. app_context->ierr=VecAssemblyBegin(measurement->y);
  533. app_context_report_error(app_context->ierr,"measurement_petsc_vector_disassemble: VecAssemblyBegin",app_context,__LINE__,__FUNCT__,__FILE__);
  534. app_context->ierr=VecAssemblyEnd(measurement->y);
  535. app_context_report_error(app_context->ierr,"measurement_petsc_vector_disassemble: VecAssemblyEnd",app_context,__LINE__,__FUNCT__,__FILE__);
  536. return 0;
  537. }
  538. //initialize the interpolation for all meausrements, from all_measurements and map_index2time
  539. int
  540. measurement_interpolation_initialize(MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  541. {
  542. interp_v(0, measurement->n_y, measurement->K, &measurement->map_index2time[1*measurement->K+0], measurement->all_measurements, -1, NULL);
  543. return 0;
  544. }
  545. //finalize the interpolation for all meausrements
  546. int
  547. measurement_interpolation_finalize(MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  548. {
  549. interp_v(2, measurement->n_y, measurement->K, NULL, NULL, -1, NULL);
  550. return 0;
  551. }
  552. //get the meausrement at any given time point, stored in single_measurement
  553. int
  554. measurement_get(double time, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  555. {
  556. if(1){ //interpolation
  557. interp_v(1, measurement->n_y, measurement->K, NULL, NULL,time, measurement->single_measurement);
  558. return 0;
  559. }
  560. }
  561. //load measurement matrix from a data file into measurement->H_values;
  562. int
  563. measurement_io_load_measurement_matrix_dat(char* filename, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  564. {
  565. int measurement_matrix_size_1 = 0, measurement_matrix_size_2 = 0;
  566. if(measurement->H_values){PetscPrintf(app_context->mpi_comm_global, "measurement matrix was already loaded (measurement->H_values=%x), so no need to load it from %s again\n", measurement->H_values,filename); assert(0);}
  567. measurement->H_values = load_matrix_2D_ascii(filename, measurement_matrix_size_1, measurement_matrix_size_2);
  568. assert(measurement_matrix_size_2==app_context->n_x+app_context->n_theta);
  569. assert(measurement_matrix_size_1==measurement->n_y);
  570. measurement->n_z = measurement_matrix_size_2;
  571. return 0;
  572. }
  573. //load measurement error covariance matrix from a data file into measurement->R_d_values;
  574. int
  575. measurement_io_load_measurement_error_covariance_matrix_dat(char* filename, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  576. {
  577. int measurement_matrix_size_1 = 0, measurement_matrix_size_2 = 0;
  578. if(measurement->R_d_values){PetscPrintf(app_context->mpi_comm_global, "measurement error covariance matrix was already loaded (measurement->R_d_values=%x), so no need to load it from %s again\n", measurement->R_d_values,filename); assert(0);}
  579. measurement->R_d_values = load_matrix_2D_ascii(filename, measurement_matrix_size_1, measurement_matrix_size_2);
  580. assert(measurement_matrix_size_2==measurement->n_y);
  581. assert(measurement_matrix_size_1==measurement->n_y);
  582. return 0;
  583. }
  584. //prepare measurement (IO, create petsc data structure etc.)
  585. MEAUSREMENT_TYPE*
  586. measurement_create_and_initialize(APP_CONTEXT_TYPE* app_context)
  587. {
  588. MEAUSREMENT_TYPE* measurement = new MEAUSREMENT_TYPE;
  589. memset(measurement, 0, sizeof(MEAUSREMENT_TYPE));
  590. if(0){
  591. measurement->n_y = 2;
  592. measurement->n_z = 4;
  593. measurement->single_measurement=new double[measurement->n_y];
  594. return measurement;
  595. }
  596. //load all measurements
  597. measurement_io_read_all_measurements(measurement, app_context);
  598. //load measurement matrix
  599. measurement_io_load_measurement_matrix_dat(app_context->measurement_matrix_file_name, measurement, app_context);
  600. { //create measurement->H (Mat type)
  601. int* index_row = new int[measurement->n_y];
  602. int* index_col = new int[measurement->n_z];
  603. MatCreate(app_context->mpi_comm_global, &measurement->H);
  604. MatSetSizes(measurement->H, PETSC_DECIDE, PETSC_DECIDE, measurement->n_y, measurement->n_z);
  605. MatSetFromOptions(measurement->H);
  606. for (int i = 0; i<measurement->n_y; i++) index_row[i]=i;
  607. for (int i = 0; i<measurement->n_z; i++) index_col[i]=i;
  608. app_context->ierr=MatSetValues(measurement->H,measurement->n_y,index_row,measurement->n_z, index_col,measurement->H_values,ADD_VALUES);
  609. MatAssemblyBegin(measurement->H,MAT_FINAL_ASSEMBLY);
  610. MatAssemblyEnd(measurement->H,MAT_FINAL_ASSEMBLY);
  611. app_context_report_error(app_context->ierr,"measurement_create_and_initialize: MatSetValues",app_context,__LINE__,__FUNCT__,__FILE__);
  612. free(index_row); free(index_col);
  613. }
  614. //load measurement error covariance matrix
  615. measurement_io_load_measurement_error_covariance_matrix_dat(app_context->measurement_error_covariance_matrix_file_name, measurement, app_context);
  616. { //create measurement->R_d (Mat type)
  617. int* index_row = new int[measurement->n_y];
  618. MatCreateMPIDense(app_context->mpi_comm_global, PETSC_DECIDE, PETSC_DECIDE, measurement->n_y, measurement->n_y, PETSC_NULL, &measurement->R_d);
  619. //MatCreate(app_context->mpi_comm_global, &measurement->R_d);
  620. //MatSetSizes(measurement->R_d, PETSC_DECIDE, PETSC_DECIDE, measurement->n_y, measurement->n_y);
  621. MatSetFromOptions(measurement->R_d);
  622. for (int i = 0; i<measurement->n_y; i++) index_row[i]=i;
  623. app_context->ierr=MatSetValues(measurement->R_d,measurement->n_y,index_row,measurement->n_y, index_row,measurement->R_d_values,ADD_VALUES);
  624. MatAssemblyBegin(measurement->R_d,MAT_FINAL_ASSEMBLY);
  625. MatAssemblyEnd(measurement->R_d,MAT_FINAL_ASSEMBLY);
  626. app_context_report_error(app_context->ierr,"measurement_create_and_initialize: MatSetValues",app_context,__LINE__,__FUNCT__,__FILE__);
  627. free(index_row);
  628. }
  629. //Create measurement error covariance matrix inverse inv_R_d
  630. MatDuplicate(measurement->R_d, MAT_COPY_VALUES, &measurement->inv_R_d);
  631. //prepare the interpolation
  632. measurement_interpolation_initialize(measurement, app_context);
  633. //usage:
  634. //ret = measurement_get(0, measurement, app_context);
  635. //if(ret==0) measurement_petsc_vector_assemble(measurement,app_context);
  636. //load the measurement error covariance R_d
  637. return measurement;
  638. }
  639. //-------------------------------------------------------------------------------------------------
  640. //---models routines---
  641. MODEL_TYPE*
  642. model_create_and_initialize(MODEL_TYPE* (*model_opeartor)(MODEL_TYPE*, APP_CONTEXT_TYPE* ), APP_CONTEXT_TYPE* app_context)
  643. {
  644. MODEL_TYPE* model = NULL;
  645. app_context->ierr = PetscMalloc(sizeof(MODEL_TYPE), (void**) &model);
  646. app_context_report_error(app_context->ierr,"app_context_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  647. model_set_opeartor_and_intial_condition(model, model_opeartor,app_context);
  648. return model;
  649. }
  650. // Initialize
  651. //1) model operator (model->f),
  652. //2) dimension (model->n_x, model->n_theta),
  653. //3) time stamp (),
  654. //4) state (model->x_k_hat,model->theta_k_hat) ,
  655. //5) previous state (model->x_k_minus_1_hat,model->theta_k_minus_1_hat)
  656. MODEL_TYPE*
  657. model_set_opeartor_and_intial_condition(MODEL_TYPE* model,MODEL_TYPE* (*model_opeartor)(MODEL_TYPE*, APP_CONTEXT_TYPE*), APP_CONTEXT_TYPE* app_context)
  658. {
  659. PetscInt i=0;
  660. if(1){ //model 01: 2 parameter, 2 state, simplest model
  661. model->f = *model_opeartor;
  662. model->k = 0;
  663. model->t = 0.0;
  664. model->n_x=app_context->n_x;
  665. // app_context->ierr=VecCreateMPIWithArray(app_context->mpi_comm_global, model->n_x, PETSC_DECIDE, app_context->x_0, &model->x_k_hat);
  666. // app_context->ierr=VecCreateMPIWithArray(app_context->mpi_comm_global, model->n_x, model->n_x, app_context->x_0, &model->x_k_hat);
  667. app_context->ierr=VecCreate(app_context->mpi_comm_global, &model->x_k_hat);
  668. app_context->ierr=VecSetSizes(model->x_k_hat, PETSC_DECIDE,app_context->n_x);
  669. app_context->ierr=VecSetFromOptions(model->x_k_hat);
  670. for(i=0;i<model->n_x; i++) app_context->tmp_x_indices[i]=i;
  671. VecSetValues(model->x_k_hat,model->n_x,app_context->tmp_x_indices,app_context->x_0,ADD_VALUES);
  672. VecAssemblyBegin(model->x_k_hat);
  673. VecAssemblyEnd(model->x_k_hat);
  674. app_context_report_error(app_context->ierr,"model_set_opeartor_and_intial_condition: VecCreateMPIWithArray",app_context,__LINE__,__FUNCT__,__FILE__);
  675. model->n_theta=app_context->n_theta;
  676. //app_context->ierr=VecCreateMPIWithArray(app_context->mpi_comm_global, model->n_theta, PETSC_DECIDE, app_context->theta_0, &model->theta_k_hat);
  677. // app_context->ierr=VecCreateMPIWithArray(app_context->mpi_comm_global, model->n_theta, model->n_theta, app_context->theta_0, &model->theta_k_hat);
  678. app_context->ierr=VecCreate(app_context->mpi_comm_global, &model->theta_k_hat);
  679. app_context->ierr=VecSetSizes(model->theta_k_hat, PETSC_DECIDE,app_context->n_theta);
  680. app_context->ierr=VecSetFromOptions(model->theta_k_hat);
  681. for(i=0;i<model->n_theta; i++) app_context->tmp_theta_indices[i]=i;
  682. VecSetValues(model->theta_k_hat,model->n_theta,app_context->tmp_theta_indices,app_context->theta_0,ADD_VALUES);
  683. VecAssemblyBegin(model->theta_k_hat);
  684. VecAssemblyEnd(model->theta_k_hat);
  685. app_context_report_error(app_context->ierr,"model_set_opeartor_and_intial_condition: VecCreateMPIWithArray",app_context,__LINE__,__FUNCT__,__FILE__);
  686. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  687. app_context_report_info(INFO_PETSC_REALARRAY,app_context->n_x, app_context->x_0,"model_set_opeartor_and_intial_condition, app_context->x_0", app_context);
  688. app_context_report_info(INFO_PETSC_REALARRAY, app_context->n_theta, app_context->theta_0,"model_set_opeartor_and_intial_condition, app_context->theta_0", app_context);
  689. app_context_report_info(INFO_PETSC_VEC,1, &model->x_k_hat,"model_set_opeartor_and_intial_condition, model->x_0_hat", app_context);
  690. app_context_report_info(INFO_PETSC_VEC, 1, &model->theta_k_hat,"model_set_opeartor_and_intial_condition, model->theta_0_hat", app_context);
  691. }
  692. }else if(0){ //model 02:
  693. app_context_report_error(app_context->ierr,"model_set_opeartor_and_intial_condition: not implemented yet",app_context,__LINE__,__FUNCT__,__FILE__);
  694. }else{
  695. app_context_report_error(app_context->ierr,"model_set_opeartor_and_intial_condition: not implemented yet",app_context,__LINE__,__FUNCT__,__FILE__);
  696. }
  697. //other standard setups
  698. VecDuplicate(model->x_k_hat, &model->x_k_minus_1_hat);
  699. VecDuplicate(model->theta_k_hat, &model->theta_k_minus_1_hat);
  700. //diagnosis
  701. if(app_context->diagnosisMode & DIAGNOSIS_DISP_INITIAL_CONF){
  702. app_context_report_info(INFO_PETSC_REAL, 1, &model->t,"model_set_opeartor_and_intial_condition, model->t", app_context);
  703. app_context_report_info(INFO_PETSC_INT, 1, &model->k,"model_set_opeartor_and_intial_condition, model->k", app_context);
  704. app_context_report_info(INFO_PETSC_INT, 1, &model->n_x,"model_set_opeartor_and_intial_condition, model->n_x", app_context);
  705. app_context_report_info(INFO_PETSC_INT, 1, &model->n_theta,"model_set_opeartor_and_intial_condition, model->n_theta", app_context);
  706. app_context_report_info(INFO_PETSC_VEC, 1, &model->theta_k_hat,"model_set_opeartor_and_intial_condition, model->theta_0_hat", app_context);
  707. app_context_report_info(INFO_PETSC_VEC, 1, &model->theta_k_minus_1_hat,"model_set_opeartor_and_intial_condition, model->theta_0_minus_1_hat", app_context);
  708. }
  709. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  710. app_context_report_info(INFO_PETSC_VEC,1, &model->x_k_hat,"model_set_opeartor_and_intial_condition, model->x_0_hat", app_context);
  711. app_context_report_info(INFO_PETSC_VEC, 1, &model->x_k_minus_1_hat,"model_set_opeartor_and_intial_condition, model->x_0_minus_1_hat", app_context);
  712. }
  713. return model;
  714. }
  715. //-------------------------------------------------------------------------------------------------
  716. //---filter routines---
  717. //create and initialize the filter
  718. FILTER_TYPE*
  719. filter_create_and_initialize(APP_CONTEXT_TYPE* app_context,MODEL_TYPE* model)
  720. {
  721. FILTER_TYPE* filter = NULL;
  722. app_context->ierr = PetscMalloc(sizeof(FILTER_TYPE), (void**) &filter);
  723. app_context_report_error(app_context->ierr,"filter_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  724. filter->n_x = app_context->n_x;
  725. filter->n_theta = app_context->n_theta;
  726. filter = filter_set_intial_condition(filter,model, app_context);
  727. return filter;
  728. }
  729. // Initialize
  730. //1) covariance for state, measurement (portion_afilter->),
  731. //2) dimension (filter->n_x, filter->n_theta),
  732. //3) time stamp (filter->),
  733. //4) state (K)
  734. FILTER_TYPE*
  735. filter_set_intial_condition(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context)
  736. {
  737. int i=0;
  738. //allocate space and initialize covariance matrix (filter subtype)
  739. filter->subfilter = filter_subtype_create_and_initialize(filter,model, app_context);
  740. //model->n_ensem = 2;
  741. //set in filter_subtype_set_intial_condition()
  742. //allocate space for sigma points (in model struture)
  743. PetscMalloc(sizeof(Vec*)*model->n_ensem, &model->x_k_minus_1);
  744. PetscMalloc(sizeof(Vec*)*model->n_ensem, &model->theta_k_minus_1);
  745. PetscMalloc(sizeof(Vec*)*model->n_ensem, &model->x_k);
  746. PetscMalloc(sizeof(Vec*)*model->n_ensem, &model->theta_k);
  747. for(i=0; i<model->n_ensem; i++){
  748. VecCreate(app_context->mpi_comm_global, &model->x_k_minus_1[i]);
  749. VecCreate(app_context->mpi_comm_global, &model->theta_k_minus_1[i]);
  750. VecCreate(app_context->mpi_comm_global, &model->x_k[i]);
  751. VecCreate(app_context->mpi_comm_global, &model->theta_k[i]);
  752. VecSetSizes(model->x_k_minus_1[i], PETSC_DECIDE,app_context->n_x);
  753. VecSetSizes(model->theta_k_minus_1[i], PETSC_DECIDE,app_context->n_theta);
  754. VecSetSizes(model->x_k[i], PETSC_DECIDE,app_context->n_x);
  755. VecSetSizes(model->theta_k[i], PETSC_DECIDE,app_context->n_theta);
  756. VecSetFromOptions(model->x_k_minus_1[i]);
  757. VecSetFromOptions(model->theta_k_minus_1[i]);
  758. VecSetFromOptions(model->x_k[i]);
  759. VecSetFromOptions(model->theta_k[i]);
  760. }
  761. return filter;
  762. }
  763. //create and initialize the filter
  764. FILTER_SUBTYPE*
  765. filter_subtype_create_and_initialize(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context)
  766. {
  767. filter->subfilter = NULL;
  768. app_context->ierr = PetscMalloc(sizeof(FILTER_SUBTYPE), (void**) &filter->subfilter);
  769. app_context_report_error(app_context->ierr,"filter_set_intial_condition: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  770. filter->subfilter = filter_subtype_set_intial_condition(filter,model, app_context);
  771. return filter->subfilter;
  772. }
  773. // Initialize the filter subtype
  774. // PetscInt filter_type;
  775. // PetscInt r; //rank ( r>=(n_theat>0)?n_theat:1, r<= n_theta+n_x;
  776. // Mat S_x;
  777. // Mat S_theta;
  778. FILTER_SUBTYPE*
  779. filter_subtype_set_intial_condition(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context)
  780. {
  781. //local values
  782. PetscScalar S_x_value; //all 1 default
  783. PetscScalar* S_theta_values; //1,1,1... default
  784. PetscInt i; //temperory usage
  785. //check pointer
  786. app_context_report_error(filter==NULL,"FILTER_TYPE* filter is null",app_context,__LINE__,__FUNCT__,__FILE__);
  787. app_context_report_error(model==NULL,"MODEL_TYPE* model is null",app_context,__LINE__,__FUNCT__,__FILE__);
  788. FILTER_SUBTYPE* subfilter=filter->subfilter;
  789. app_context_report_error(subfilter==NULL,"filter->subfilter is null",app_context,__LINE__,__FUNCT__,__FILE__);
  790. //initialize the subfilter
  791. subfilter->filter_type = FILTER_TYPE_RUKF; //hard-code rUKF
  792. // Initialize
  793. // Mat S_x;
  794. // Mat S_theta;
  795. switch(subfilter->filter_type)
  796. {
  797. case FILTER_TYPE_RUKF: //reduced-order UKF
  798. //choose rank
  799. if(model->n_theta==0){ //state estimation only
  800. subfilter->r = model->n_x - 1;
  801. }//chanllenge it by setting it to be not equal to n_x
  802. else{ //joint estimation
  803. subfilter->r = model->n_theta + 0 ; //chanllenge it by setting it to be not equal to n_theta
  804. }
  805. model->n_ensem = subfilter->r * 2;
  806. //allocate space for S_x, S_theta; app_context->S_ensemble, app_context->P_z, app_context->S_z
  807. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_x,subfilter->r, PETSC_NULL, &subfilter->S_x);
  808. app_context_report_error(app_context->ierr,"subfilter->S_x MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  809. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_theta,subfilter->r, PETSC_NULL, &subfilter->S_theta);
  810. app_context_report_error(app_context->ierr,"subfilter->S_theta MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  811. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_x+model->n_theta,model->n_ensem, PETSC_NULL, &app_context->S_ensemble);
  812. app_context_report_error(app_context->ierr,"app_context->S_ensemble MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  813. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_x+model->n_theta,model->n_ensem, PETSC_NULL, &app_context->S_ensemble2);
  814. app_context_report_error(app_context->ierr,"app_context->S_ensemble2 MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  815. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_x+model->n_theta,model->n_x+model->n_theta, PETSC_NULL, &app_context->P_z);
  816. app_context_report_error(app_context->ierr,"app_context->P_z MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  817. app_context->ierr=MatCreateMPIDense(PETSC_COMM_WORLD, PETSC_DECIDE, PETSC_DECIDE, model->n_x+model->n_theta,subfilter->r, PETSC_NULL, &app_context->S_z);
  818. app_context_report_error(app_context->ierr,"app_context->S_z MatCreateMPIDense",app_context,__LINE__,__FUNCT__,__FILE__);
  819. MatAssemblyBegin(app_context->S_z ,MAT_FINAL_ASSEMBLY ); //for later svd usage
  820. MatAssemblyEnd (app_context->S_z ,MAT_FINAL_ASSEMBLY ); //for later svd usage
  821. MatSetFromOptions( subfilter->S_x );
  822. MatSetFromOptions( subfilter->S_theta );
  823. MatSetFromOptions( app_context->S_ensemble );
  824. MatSetFromOptions( app_context->P_z );
  825. MatSetFromOptions( app_context->S_z );
  826. //initialization S_x and S_theta
  827. //values
  828. app_context->ierr=PetscMalloc(sizeof(PetscScalar)*model->n_theta, &S_theta_values);
  829. for(i=0;i<model->n_theta; i++){
  830. S_theta_values[i] = 1.0;
  831. }
  832. S_x_value = 1.0;
  833. //set (set diagonal element of S_theta first)
  834. for(i=0; i<model->n_theta; i++){
  835. MatSetValue(subfilter->S_theta, i,i, S_theta_values[i], INSERT_VALUES);
  836. }
  837. MatAssemblyBegin(subfilter->S_theta,MAT_FINAL_ASSEMBLY );
  838. MatAssemblyEnd (subfilter->S_theta,MAT_FINAL_ASSEMBLY );
  839. //(then set diagonal element of S_x )
  840. for(i=0; i < subfilter->r-model->n_theta; i++){
  841. MatSetValue(subfilter->S_x, i, i+model->n_theta, S_x_value, INSERT_VALUES);
  842. }
  843. MatAssemblyBegin(subfilter->S_x,MAT_FINAL_ASSEMBLY );
  844. MatAssemblyEnd (subfilter->S_x,MAT_FINAL_ASSEMBLY );
  845. //diagnosis
  846. if(app_context->diagnosisMode & DIAGNOSIS_DISP_INITIAL_CONF){
  847. app_context_report_info(INFO_PETSC_MAT, 1, &subfilter->S_x,"subfilter->S_x_0", app_context);
  848. app_context_report_info(INFO_PETSC_MAT, 1, &subfilter->S_theta,"subfilter->S_theta_0", app_context);
  849. }
  850. break;
  851. default: //others
  852. app_context_report_error(1,"filter->filter_type not implemented",app_context,__LINE__,__FUNCT__,__FILE__);
  853. }
  854. return subfilter;
  855. }
  856. void
  857. app_context_create_and_initialize_dependently(APP_CONTEXT_TYPE* app_context, FILTER_TYPE* filter, MODEL_TYPE* model, MEAUSREMENT_TYPE* measurement)
  858. {
  859. //S_bar
  860. app_context->S_bar = petsc_create_matrix(1, measurement->n_y, filter->subfilter->r,app_context->mpi_comm_global);
  861. //S_bar2
  862. MatDuplicate(app_context->S_bar, MAT_COPY_VALUES, &app_context->S_bar2);
  863. //tmp_r
  864. app_context->tmp_r = petsc_create_matrix(1, filter->subfilter->r, filter->subfilter->r,app_context->mpi_comm_global);
  865. //tmp_nz_by_r
  866. app_context->tmp_nz_by_r = petsc_create_matrix(1, app_context->n_x+app_context->n_theta, filter->subfilter->r,app_context->mpi_comm_global);
  867. //tmp_r_by_ny
  868. app_context->tmp_r_by_ny = petsc_create_matrix(1, filter->subfilter->r, measurement->n_y, app_context->mpi_comm_global);
  869. //tmp_y
  870. app_context->tmp_y = petsc_create_vector(1, measurement->n_y, app_context->mpi_comm_global);
  871. //Kalman gain matrix: K
  872. filter->K = petsc_create_matrix(1, filter->n_x+filter->n_theta,measurement->n_y,app_context->mpi_comm_global);
  873. }
  874. // generate sigma points from filter->covariance and model->x_k_hat
  875. MODEL_TYPE*
  876. filter_generate_sigma_points(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context)
  877. {
  878. int i;
  879. PetscScalar localScale; //localization parameter
  880. app_context_assert(model->n_ensem>=1, "", app_context);
  881. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  882. app_context_report_info(INFO_PETSC_INT, 1, &model->k,"filter_generate_sigma_points, model->k", app_context);
  883. app_context_report_info(INFO_PETSC_REAL, 1, &model->t,"filter_generate_sigma_points, model->t", app_context);
  884. app_context_report_info(INFO_PETSC_INT, 1, &i,"i", app_context);
  885. app_context_report_info(INFO_PETSC_VEC, 1, &model->x_k_hat,"filter_generate_sigma_points, model->x_k_hat", app_context);
  886. app_context_report_info(INFO_PETSC_VEC, 1, &model->theta_k_hat,"filter_generate_sigma_points, model->theta_k_hat", app_context);
  887. app_context_report_info(INFO_PETSC_MAT, 1, &filter->subfilter->S_x,"/*filter_generate_sigma_points, filter->subfilter->S_x*/", app_context);
  888. app_context_report_info(INFO_PETSC_MAT, 1, &filter->subfilter->S_theta,"filter_generate_sigma_points, filter->subfilter->S_theta", app_context);
  889. }
  890. if(0){ //temp: assume filter->covariance is 0
  891. for(i=0; i<model->n_ensem; i++){ //model->n_ensem>=1
  892. VecCopy(model->x_k_hat, model->x_k[i]);
  893. VecCopy(model->theta_k_hat, model->theta_k[i]);
  894. }
  895. }
  896. if(1){ //generate sigma points from filter->covariance and model->x_k_hat
  897. if(filter->subfilter->filter_type!=FILTER_TYPE_RUKF){
  898. //calculate the square-root matrix of filter->covariance
  899. //1. allocate memory
  900. //2. do svd, storge them in filter->subfilter->S_x, filter->subfilter->S_theta
  901. }
  902. //3. piling up first r eig vectors weighted by eig values
  903. localScale = 1; //hard coded 1, localization parameter
  904. for(i=0; i<filter->subfilter->r; i++){
  905. MatGetColumnVector(filter->subfilter->S_x,app_context->tmp_x,i);
  906. VecWAXPY(model->x_k[i], 1*localScale, app_context->tmp_x, model->x_k_hat);
  907. VecWAXPY(model->x_k[i+filter->subfilter->r], -1*localScale, app_context->tmp_x, model->x_k_hat);
  908. //TODO!!Arguments are incompatible!
  909. //[0]PETSC ERROR: Incompatible vector global lengths!
  910. //solution: generalize MatGetColumnVector-->get the global vector instead of only the local portion!
  911. MatGetColumnVector(filter->subfilter->S_theta,app_context->tmp_theta,i);
  912. VecWAXPY(model->theta_k[i], 1*localScale, app_context->tmp_theta, model->theta_k_hat);
  913. VecWAXPY(model->theta_k[i+filter->subfilter->r], -1*localScale, app_context->tmp_theta, model->theta_k_hat);
  914. //diagnosis
  915. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  916. app_context_report_info(INFO_PETSC_VEC, 1, &model->theta_k[i],"filter_generate_sigma_points, model->theta_k[i]", app_context);
  917. app_context_report_info(INFO_PETSC_VEC,1, &model->x_k[i],"filter_generate_sigma_points, model->x_k[i]", app_context);
  918. }
  919. }
  920. }
  921. return model;
  922. }
  923. FILTER_TYPE*
  924. filter_time_update(FILTER_TYPE* filter, MODEL_TYPE* model, APP_CONTEXT_TYPE* app_context)
  925. {
  926. int i=0;
  927. PetscErrorCode ierr;
  928. PetscInt nEigs; //number of eig vectors to be retrieved
  929. //sigma points
  930. filter_generate_sigma_points(filter, model, app_context);
  931. //model evaluation
  932. model->f(model, app_context);
  933. //compute mean
  934. ierr=VecAXPY(model->x_k_hat,-1, model->x_k_hat); //nullize
  935. for(i=0; i<model->n_ensem; i++){
  936. ierr=VecAXPY(model->x_k_hat,1, model->x_k[i]);
  937. }
  938. ierr=VecScale(model->x_k_hat, 1.0/model->n_ensem );
  939. ierr=VecAXPY(model->theta_k_hat,-1, model->theta_k_hat);//nullize
  940. for(i=0; i<model->n_ensem; i++){
  941. ierr=VecAXPY(model->theta_k_hat,1, model->theta_k[i]);
  942. }
  943. ierr=VecScale(model->theta_k_hat, 1.0/model->n_ensem );
  944. //1. compute covariance (filter->subfilter->S_x and filter->subfilter->S_theta)
  945. //todo: add inflation parameter later
  946. //1.1. join them together (use MatSetColumnVec)
  947. for(i=0; i<model->n_ensem; i++){
  948. ierr=VecWAXPY(app_context->tmp_x, -1.0, model->x_k_hat, model->x_k[i]); app_context_report_error(ierr,"VecWAXPY",app_context,__LINE__,__FUNCT__,__FILE__);
  949. ierr=MatSetColumnVec(&app_context->S_ensemble, &app_context->tmp_x, app_context->tmp_x_indices, i, 0, 0, model->n_x);
  950. ierr=VecWAXPY(app_context->tmp_theta, -1.0, model->theta_k_hat, model->theta_k[i]);
  951. app_context_report_error(ierr,"VecWAXPY",app_context,__LINE__,__FUNCT__,__FILE__);
  952. ierr=MatSetColumnVec(&app_context->S_ensemble, &app_context->tmp_theta, app_context->tmp_theta_indices, i, model->n_x, 0, model->n_theta);
  953. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  954. app_context_report_info(INFO_PETSC_VEC,1, &model->x_k[i],"compute covariance, filter_time_update, model->x_k[i]", app_context);
  955. app_context_report_info(INFO_PETSC_VEC, 1, &model->theta_k[i],"compute covariance, filter_time_update, model->theta_k[i]", app_context);
  956. }
  957. }
  958. MatAssemblyBegin(app_context->S_ensemble,MAT_FINAL_ASSEMBLY );
  959. MatAssemblyEnd (app_context->S_ensemble,MAT_FINAL_ASSEMBLY );
  960. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  961. app_context_report_info(INFO_PETSC_MAT, 1, &app_context->S_ensemble,"compute covariance, filter_time_update, app_context->S_ensemble", app_context);
  962. }
  963. //1.2. P_z=S_ensemble*S_ensemble'
  964. MatCopy(app_context->S_ensemble,app_context->S_ensemble2,SAME_NONZERO_PATTERN);
  965. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  966. app_context_report_info(INFO_PETSC_MAT, 1, &app_context->S_ensemble,"compute covariance, filter_time_update, app_context->S_ensemble", app_context);
  967. app_context_report_info(INFO_PETSC_MAT, 1, &app_context->S_ensemble2,"compute covariance, filter_time_update, app_context->S_ensemble2", app_context);
  968. }
  969. MatMultilXYT(app_context->S_ensemble, app_context->S_ensemble2, &app_context->P_z, app_context->mpi_comm_global);
  970. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  971. app_context_report_info(INFO_PETSC_MAT, 1, &app_context->P_z,"compute covariance, filter_time_update, app_context->P_z", app_context);
  972. }
  973. //
  974. //2. do svd
  975. nEigs = filter->subfilter->r;
  976. MatSVD(&app_context->P_z, app_context->mpi_comm_global, &nEigs, NULL, &app_context->S_z, NULL,1);
  977. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  978. app_context_report_info(INFO_PETSC_INT, 1, &nEigs,"number of computed nEigs vectors, filter_time_update, nEigs", app_context);
  979. app_context_report_info(INFO_PETSC_MAT, 1, &app_context->S_z,"result of SVD, filter_time_update, app_context->S_z", app_context);
  980. }
  981. if(nEigs!=filter->subfilter->r){
  982. PetscPrintf(app_context->mpi_comm_global, "app_context->P_z only has %d eig vectors (filter->subfilter->r=%d)!!\n", nEigs, filter->subfilter->r);
  983. assert(0); //static rank
  984. }
  985. //3. separate them (use MatSetColumnVec or MatSetMatBlock)
  986. MatSetMatBlock(app_context->mpi_comm_global, &filter->subfilter->S_x, app_context->S_z, 0, 0, 0, 0, model->n_x, filter->subfilter->r);
  987. MatSetMatBlock(app_context->mpi_comm_global, &filter->subfilter->S_theta, app_context->S_z, 0, 0, model->n_x, 0, model->n_theta,filter->subfilter->r);
  988. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  989. app_context_report_info(INFO_PETSC_MAT, 1, &filter->subfilter->S_x,"S_x, after SVD, filter_time_update, filter->subfilter->S_x", app_context);
  990. app_context_report_info(INFO_PETSC_MAT, 1, &filter->subfilter->S_theta,"S_theta, after SVD, filter_time_update, filter->subfilter->S_theta", app_context);
  991. app_context_report_info(INFO_PETSC_INT, 1, &nEigs,"==exit of filter_time_update==", app_context);
  992. }
  993. app_context_report_error(ierr,"exit of filter_time_update",app_context,__LINE__,__FUNCT__,__FILE__);
  994. return filter;
  995. }
  996. FILTER_TYPE*
  997. filter_measurement_update(FILTER_TYPE* filter, MODEL_TYPE* model, MEAUSREMENT_TYPE* measurement, APP_CONTEXT_TYPE* app_context)
  998. {
  999. PetscErrorCode ierr=0;
  1000. app_context_report_error(ierr,"entry of filter_measurement_update",app_context,__LINE__,__FUNCT__,__FILE__);
  1001. if(0){ //generate synthetic data
  1002. VecDuplicate(model->x_k_hat,&measurement->y);
  1003. measurement_petsc_vector_disassemble(measurement,app_context);
  1004. sprintf(app_context->measurement_data_file_name, "%s%04d.dat", app_context->measurement_dir_name, model->k); //assume model->k==model->t
  1005. measurement_io_write_single_measurement_dat(app_context->measurement_data_file_name, measurement, app_context);
  1006. return filter;
  1007. }
  1008. //2. covariance update and gain matrix caculation----------
  1009. // S_bar = H*S_minus;
  1010. // inv_R_d = inv(R_d);
  1011. // tmp = eye(npdof,npdof) + S_bar'*inv_R_d*S_bar;
  1012. // inv_tmp = inv(tmp);
  1013. // try
  1014. // S_plus = S_minus * chol(inv_tmp,'lower');
  1015. // catch ME
  1016. // disp('exception:Matrix must be positive definite with real diagonal.');
  1017. // keyboard;
  1018. // end
  1019. // P_plus = S_plus * S_plus';
  1020. // K_x = S_minus * inv_tmp * S_bar'*inv_R_d;
  1021. // S_minus (app_context->S_z) = [filter->subfilter->S_x; filter->subfilter->S_theta];
  1022. for(int i=0; i<filter->subfilter->r; i++){
  1023. ierr=MatGetColumnVector(filter->subfilter->S_x, app_context->tmp_x, i);
  1024. app_context_report_error(ierr,"",app_context,__LINE__,__FUNCT__,__FILE__);
  1025. ierr=MatSetColumnVec(&app_context->S_z, &app_context->tmp_x, app_context->tmp_x_indices, i, 0, 0, model->n_x);
  1026. app_context_report_error(ierr,"",app_context,__LINE__,__FUNCT__,__FILE__);
  1027. ierr=MatGetColumnVector(filter->subfilter->S_theta, app_context->tmp_theta, i);
  1028. app_context_report_error(ierr,"",app_context,__LINE__,__FUNCT__,__FILE__);
  1029. ierr=MatSetColumnVec(&app_context->S_ensemble, &app_context->tmp_theta, app_context->tmp_theta_indices, i, model->n_x, 0, model->n_theta);
  1030. app_context_report_error(ierr,"",app_context,__LINE__,__FUNCT__,__FILE__);
  1031. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  1032. app_context_report_info(INFO_PETSC_VEC,1, &app_context->tmp_x,"filter_measurement_update, filter->subfilter->S_x(i,:)", app_context);
  1033. app_context_report_info(INFO_PETSC_VEC, 1, &app_context->tmp_theta,"filter_measurement_update, filter->subfilter->S_theta(i,:)", app_context);
  1034. }
  1035. }
  1036. MatAssemblyBegin(app_context->S_z,MAT_FINAL_ASSEMBLY );
  1037. MatAssemblyEnd (app_context->S_z,MAT_FINAL_ASSEMBLY );
  1038. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  1039. app_context_report_info(INFO_PETSC_MAT, 1, &app_context->S_z,"filter_measurement_update, app_context->S_z", app_context);
  1040. }
  1041. // S_bar(app_context->S_bar) = H*S_minus;
  1042. MatMultilXY(measurement->H, app_context->S_z, &app_context->S_bar, app_context->mpi_comm_global);
  1043. // inv_R_d = inv(R_d);
  1044. MatInverse(measurement->R_d, &measurement->inv_R_d, app_context->mpi_comm_global);
  1045. // tmp = eye(npdof,npdof) + S_bar'*inv_R_d*S_bar;
  1046. MatMultilXY(measurement->inv_R_d, app_context->S_bar, &app_context->S_bar2, app_context->mpi_comm_global);
  1047. MatMultilXTY(app_context->S_bar, app_context->S_bar2, &app_context->tmp_r, app_context->mpi_comm_global);
  1048. MatShift(app_context->tmp_r,1);
  1049. // inv_tmp = inv(tmp);
  1050. Mat tmp = app_context->tmp_r;
  1051. MatInverse(app_context->tmp_r, &app_context->tmp_r, app_context->mpi_comm_global);
  1052. MatDestroy(tmp);
  1053. // K_x = S_minus * inv_tmp * S_bar'*inv_R_d;
  1054. MatMultilXY(app_context->S_z, app_context->tmp_r, &app_context->tmp_nz_by_r, app_context->mpi_comm_global);
  1055. MatMultilXTY(app_context->S_bar, measurement->inv_R_d, &app_context->tmp_r_by_ny, app_context->mpi_comm_global);
  1056. MatMultilXY(app_context->tmp_nz_by_r,app_context->tmp_r_by_ny, &filter->K, app_context->mpi_comm_global);
  1057. // S_plus(app_context->S_z) = S_minus * chol(inv_tmp,'lower');
  1058. MatFactorize(app_context->tmp_r, app_context->mpi_comm_global, 1);
  1059. MatMultilXY (app_context->S_z, app_context->tmp_r, &app_context->tmp_nz_by_r, app_context->mpi_comm_global);
  1060. MatCopy(app_context->tmp_nz_by_r, app_context->S_z, SAME_NONZERO_PATTERN);
  1061. // [filter->subfilter->S_x; filter->subfilter->S_theta]=S_minus (app_context->S_z)
  1062. MatSetMatBlock(app_context->mpi_comm_global, &filter->subfilter->S_x , app_context->S_z,0,0,0, 0, model->n_x, filter->subfilter->r);
  1063. MatSetMatBlock(app_context->mpi_comm_global, &filter->subfilter->S_theta, app_context->S_z,0,0,model->n_x,0, model->n_theta, filter->subfilter->r);
  1064. //(ignore) P_plus = S_plus * S_plus';
  1065. // clean up
  1066. MatDestroy(measurement->inv_R_d);
  1067. //3. update state---------------------------------------
  1068. // y = model.u_t(:); //synthetic measurement
  1069. // correction =measurementAmplifyFactor * K_x*(H*z-y);
  1070. // tmp = model.parameters(:) + correction(ndof+1:nadof);
  1071. // y = model.u_t(:); //synthetic measurement
  1072. //get the measurement
  1073. int ret = measurement_get(model->k, measurement, app_context);
  1074. if(ret==0) measurement_petsc_vector_assemble(measurement,app_context);
  1075. // z(app_context->tmp_z) = [model->x_k_hat;model->theta_k_hat];
  1076. VecSetVecBlock(app_context->mpi_comm_global, &app_context->tmp_z, model->x_k_hat, 0, 0, model->n_x);
  1077. VecSetVecBlock(app_context->mpi_comm_global, &app_context->tmp_z, model->theta_k_hat, model->n_x, 0, model->n_theta);
  1078. // H*z
  1079. MatMultilXY(measurement->H, app_context->S_z, &app_context->S_bar, app_context->mpi_comm_global);
  1080. // correction(app_context->tmp_z) =measurementAmplifyFactor * K_x*(H*z-y);
  1081. VecScale(measurement->y, -1);
  1082. MatMultAdd(measurement->H, app_context->tmp_z,measurement->y,app_context->tmp_y);
  1083. MatMult (filter->K, app_context->tmp_y, app_context->tmp_z);
  1084. // [model->x_k_hat;model->theta_k_hat] = z(app_context->tmp_z);
  1085. VecSetVecBlock(app_context->mpi_comm_global, &model->x_k_hat, app_context->tmp_z, 0, 0, model->n_x);
  1086. VecSetVecBlock(app_context->mpi_comm_global, &model->theta_k_hat, app_context->tmp_z, 0, model->n_x, model->n_theta);
  1087. //4. filter monitor---------------------------------------
  1088. if(app_context->diagnosisMode & DIAGNOSIS_DISP_EVERYTHING){
  1089. app_context_report_info(INFO_PETSC_VEC, 1, &model->x_k_hat,"x_k_hat, after filter_measurement_update, model->x_k_hat", app_context);
  1090. app_context_report_info(INFO_PETSC_VEC, 1, &model->theta_k_hat,"theta_k_hat, after filter_measurement_update, model->theta_k_hat", app_context);
  1091. app_context_report_info(INFO_PETSC_MAT, 1, &filter->subfilter->S_x,"S_x, after filter_measurement_update, filter->subfilter->S_x", app_context);
  1092. app_context_report_info(INFO_PETSC_MAT, 1, &filter->subfilter->S_theta,"S_theta, after filter_measurement_update, filter->subfilter->S_theta", app_context);
  1093. app_context_report_info(INFO_PETSC_MAT, 1, &filter->K,"K, after filter_measurement_update, filter->K", app_context);
  1094. }
  1095. app_context_report_error(ierr,"exit of filter_measurement_update",app_context,__LINE__,__FUNCT__,__FILE__);
  1096. return filter;
  1097. }
  1098. //-------------------------------------------------------------------------------------------------
  1099. //---optimizer routines (not implemented yet. TODO!!)---
  1100. OPTIMIZER_TYPE*
  1101. optimizer_create_and_initialize(APP_CONTEXT_TYPE* app_context)
  1102. {
  1103. OPTIMIZER_TYPE* optimizer = NULL;
  1104. app_context->ierr = PetscMalloc(sizeof(OPTIMIZER_TYPE), (void**) &optimizer);
  1105. app_context_report_error(app_context->ierr,"filter_create_and_initialize: PetscMalloc",app_context,__LINE__,__FUNCT__,__FILE__);
  1106. optimizer_set_intial_condition(optimizer,app_context);
  1107. return optimizer;
  1108. }
  1109. OPTIMIZER_TYPE*
  1110. optimizer_set_intial_condition(OPTIMIZER_TYPE* optimizer, APP_CONTEXT_TYPE* app_context)
  1111. {
  1112. return optimizer;
  1113. }
  1114. //---- Pesudo-code (matlab) of reduced-order UKF ----------------------------
  1115. //--- global variable declaration and initialization
  1116. //configurationfile='';
  1117. //estimationFromRealData = 0; %defualt value
  1118. //estimator = 'seik';
  1119. //---configuration
  1120. // load(configurationfile);
  1121. // save configuration state
  1122. // set up simulation folders and default variables
  1123. // -------------- filter variables---------
  1124. //nadof = ndof+npdof;
  1125. //r=npdof;
  1126. //u_0 = zeros(ndof,1);%only the size matter, no the values
  1127. //H = [eye(ndof,ndof) zeros(ndof,npdof)];
  1128. //R_d = eye(ndof,ndof)*R_scale;
  1129. //model.u_t = u_0;
  1130. //parameters_truth = normalize('normalize', parameters_truth,model.parametersRange);
  1131. //if(exist('pertubulation','var')==1)
  1132. // model.parameters = parameters_truth + (rand(size(parameters_truth))-0.5)*2 .* pertubulation;
  1133. //else
  1134. // model.parameters = normalize('normalize', model.parameters,model.parametersRange);
  1135. //end
  1136. //S_plus_theta = diag(min(model.parameters, 1-model.parameters)) * S_plus_theta_scale;
  1137. //S_plus = [zeros(ndof,npdof); S_plus_theta];
  1138. //io_save_variable([objective '/-----configuration-----'],[]); %mark this simulation
  1139. //io_dynamical_simulation_snapshot('initialize',t:Delta_t/nIter:N+Delta_t*(nIter-1)/nIter);
  1140. // looping
  1141. //while 1
  1142. //---time update
  1143. // model simulation
  1144. // filter equations
  1145. //---meausrment update
  1146. //load measurement
  1147. //covariance update and gain matrix caculation
  1148. //update state
  1149. //post-processing (disp,save)
  1150. //save parameter history